VSIX(Visual Studio扩展)“字体和颜色”更改事件。

3

我正在编写一个针对Visual Studio 2012/2013的扩展程序,并且出于性能原因,所有配置值都被缓存。

为了使“字体和颜色”中的更改实时可见,我需要知道用户何时更改了选项。

有没有办法在用户更改任何选项设置时获得通知?

目前,我有一个解决方法,在我的初始化方法中使用Windows.WindowCreated事件:

Dispatcher.CurrentDispatcher.BeginInvoke(
    new Action( () => {
        DTE.Events.WindowEvents.WindowCreated += WindowEvents_WindowCreated;
    } ), DispatcherPriority.ApplicationIdle, null );
3个回答

2

2
+1,我个人使用过此方法,确切地实现了 OP 所需的功能。请注意,在 VS 2013 中,使用 NOAUTOCOLORS 选项从字体和颜色存储服务获取给定颜色时,存在仍未解决的 bug,当主题改变且颜色设置为“自动”时。有一个可以解决问题的解决方法(有效!),请参见论坛帖子上 Josh 的答案 - Cameron
我现在在VS2015和2017上又遇到了这个问题...难以置信。 - Blake Niemyjski

1
感谢所有的输入。我觉得我找到了一些有用的东西。我有一个 IWpfTextViewCreationListener。我添加了以下代码行:
[Import]
public IEditorFormatMapService FormatMapService = null; // MEF

public void TextViewCreated( IWpfTextView textView ) {
    IEditorFormatMap editorFormatMap = FormatMapService.GetEditorFormatMap( textView );
    editorFormatMap.FormatMappingChanged += FormatMapChanged;
}

void FormatMapChanged( object sender, FormatItemsEventArgs e ) {
    /* do something */
}
< p > FormatItemsEventArgs 包含所有更改的字体和颜色。这正是我所需要的。 < /p >

2
public void TextViewCreated(IWpfTextView textView) 谁调用了它?你是怎么得到所需的文本视图的?为什么这么难找到一个可行的例子!微软文档是最糟糕的之一,用户内容几乎不存在!任何人如何弄清楚这些东西? - Josh Sanders

1
你正在寻找的事件是 IEditorFormatMap::FormatMappingChanged。当 "字体和颜色" 部分中的值更改时,它将触发。这个接口是特定于特定的 ITextView 实例,但你可以轻松地将它聚合到所有创建的 ITextView 实例上。
要获取此接口,您需要导入 IEditorFormatMapFactoryService。该服务提供从 ITextView -> IEditorFormatMap 的映射。

这是我使用Visual Studio扩展的第一步。一个完整的代码示例会非常有用。 - Michael A. Volz aka Flynn
1
@Flynn 很抱歉,一份完整的代码示例超出了我可以放在堆栈溢出答案中的范围。VS扩展样例往往是这样的。但是您可以从以下链接开始查看。这两个文件共同查看了我提到的确切事件。 https://github.com/jaredpar/VsVim/blob/master/Src/VimWpf/Implementation/BlockCaret/BlockCaretFactoryService.cs https://github.com/jaredpar/VsVim/blob/master/Src/VimWpf/Implementation/BlockCaret/BlockCaret.cs - JaredPar
“完整的代码示例”可能不是正确的措辞。我只需要基本结构(可能使用MEF)来到达此事件。为了到达WindowCreated事件,我使用了:DTE.Events.WindowEvents.WindowCreated += WindowEvents_WindowCreated; 是否有类似的方法可以到达Preferences Changed事件? - Michael A. Volz aka Flynn
再次感谢,您的答案给了我足够的信息找到正确的答案。 - Michael A. Volz aka Flynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接