我有一个简单的 Visual Studio 扩展,它的构建方式与本演练中介绍的方式相似(使用IWpfTextViewCreationListener接口)。
该扩展程序使用了两种我想配置的颜色。
如何为此扩展定义选项对话框?(例如,出现在“工具/选项”菜单中的属性页面)
我曾尝试使用DialogPage Class来做到这一点,但显然它需要一个 VSPackage 并且我不确定这种方法是否与我正在做的兼容。
我有一个简单的 Visual Studio 扩展,它的构建方式与本演练中介绍的方式相似(使用IWpfTextViewCreationListener接口)。
该扩展程序使用了两种我想配置的颜色。
如何为此扩展定义选项对话框?(例如,出现在“工具/选项”菜单中的属性页面)
我曾尝试使用DialogPage Class来做到这一点,但显然它需要一个 VSPackage 并且我不确定这种方法是否与我正在做的兼容。
我认为您可以在不提供自定义 OptionsPage 的情况下自定义颜色。您可以导出自己的颜色,它们将从Tools- Options-Fonts and Colors
通过您的链接示例:
[Export(typeof(EditorFormatDefinition))]
[Name("EditorFormatDefinition/MyCustomFormatDefinition")]
[UserVisible(true)]
internal class CustomFormatDefinition : EditorFormatDefinition
{
public CustomFormatDefinition( )
{
this.BackgroundColor = Colors.LightPink;
this.ForegroundColor = Colors.DarkBlue;
this.DisplayName = "My Cusotum Editor Format";
}
}
[Export(typeof(EditorFormatDefinition))]
[Name("EditorFormatDefinition/MyCustomFormatDefinition2")]
[UserVisible(true)]
internal class CustomFormatDefinition2 : EditorFormatDefinition
{
public CustomFormatDefinition2( )
{
this.BackgroundColor = Colors.DeepPink;
this.ForegroundColor = Colors.DarkBlue;
this.DisplayName = "My Cusotum Editor Format 2";
}
}
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal class TestViewCreationListener : IWpfTextViewCreationListener
{
[Import]
internal IEditorFormatMapService FormatMapService = null;
public void TextViewCreated( IWpfTextView textView )
{
IEditorFormatMap formatMap = FormatMapService.GetEditorFormatMap(textView);
ResourceDictionary selectedText = formatMap.GetProperties("Selected Text");
ResourceDictionary inactiveSelectedText = formatMap.GetProperties("Inactive Selected Text");
ResourceDictionary myCustom = formatMap.GetProperties("EditorFormatDefinition/MyCustomFormatDefinition");
ResourceDictionary myCustom2 = formatMap.GetProperties("EditorFormatDefinition/MyCustomFormatDefinition2");
formatMap.BeginBatchUpdate();
selectedText[EditorFormatDefinition.BackgroundBrushId] = myCustom[EditorFormatDefinition.BackgroundBrushId];
formatMap.SetProperties("Selected Text", selectedText);
inactiveSelectedText[EditorFormatDefinition.BackgroundBrushId] = myCustom2[EditorFormatDefinition.BackgroundBrushId];
formatMap.SetProperties("Inactive Selected Text", myCustom2);
formatMap.EndBatchUpdate();
}
}
自定义 EFD 可以提供SolidColorBrush
es。
如果这还不够,您还可以访问 VSPackages 使用的服务提供程序。您可以为选项页面制作一个包,并通过服务提供者使用自定义服务与编辑器扩展进行通信。
您可以像这样导入服务提供者:
[Import]
internal SVsServiceProvider serviceProvider = null;
此解决方案也不需要您迁移原始逻辑,只需要创建一个额外的包。
我知道这很旧,但我认为其中一些链接可能会对您有所帮助(注意:我自己实际上并没有这样做)。
我猜您缺少 MSDN 页面中详细说明的属性:
[ProvideOptionPage(typeof(OptionPageGrid),
"My Category", "My Grid Page", 0, 0, true)]
其他一些选项是:
如果您确实决定制作 VSPackage(因为我相信这是推荐的方法),请参阅此 MSDN 页面和此其他SO 答案。我还在我的博客 here 上展示了如何使用 C# 和用于选项页面的 WPF 用户控件来执行此操作。