在Visual Studio Designer中,可以在属性窗口下使用颜色选择器选择ForeColor
,BackColor
等等。当您要选择颜色时,颜色选择器会带有“自定义,Web,系统”选项卡。如果选择“自定义”,则可以向选择器添加新的颜色,但是只有底部的2行是可更改的,并且更改不会在控件之间持久存在。因此,如果您向调色板添加颜色,则当您选择另一个控件并想要更改时,例如,BackColor
您以前添加的颜色不存在。
有没有一种方法可以创建一组自定义颜色并将其导入到设计师的颜色选择控件中?
注意:这个问题不是关于VS主题的问题,也不是关于颜色是否可以在后面的代码中作为类实现的问题。我正在寻找一种定制设计师的方法。
帮助您在Visual Studio中选择颜色的编辑器ColorEditor
不会在不同控件之间保留自定义颜色。要解决该问题,您应该:
UITypeEditor
基于的自定义ColorEditor
Color
在Visual Studio启动时注册编辑器以进行输入这是一个详细的答案,其中包括我用来解决该问题的代码。
创建CustomColorEditor
ColorEditor
使用私有ColorUI
类显示私有ColorPalette
控件。调色板使用颜色数组显示自定义颜色。
为了创建CustomColorEditor
从ColorEditor
反射派生并使用反射的I ,找到这些成员并使用一些颜色的静态数组填充数组,以在首次加载时显示它们。然后,在关闭编辑器之后,我从编辑器获取自定义颜色,并将其放入静态数组中,并在下次加载时使用此静态数组初始化颜色编辑器。这样,自定义颜色将在my的所有实例之间共享CustomColorEditor
。
显示CustomColorEditor而不是默认的ColorEditor
要显示特定类型的所有属性的ui类型编辑器,应将Editor
属性添加到该类型。但是由于Color
不是我的类型,如何Editor
为它添加属性?
TypeDescriptor.AddAttributes
帮助我注册了Color
类型的编辑器。
我应该在哪里运行代码来注册属性?当然在Visual Studio运行时!
为此,我创建了一个Visual Studio Package项目,并将注册代码放在Initialize
package方法中。我还向ProvideAutoLoad
包类添加了属性,以使其在打开解决方案时自动加载。
然后我安装了软件包。
然后我将dll放入GAC中gacutil.exe /i "path to dll"
。代替GAC,还可以将dll放在Visual Studio中,devenv.exe
因为Visual stusio运行时将使用它来显示所有颜色属性的自定义颜色编辑器。
结论
完成上述任务后,我打开了一个新的Visual Studio实例,并在Windows Forms项目中看到了针对颜色显示的自定义颜色编辑器。我设置的初始颜色显示出来。此外,颜色编辑器甚至在不同形式之间也保留了自定义颜色!
我在这里分享了代码。您可以使用构想和代码来增强编辑器。您可以提供自定义颜色以在开始时显示在编辑器中。您甚至可以在编辑器中添加另一个标签。这是我的代码:
颜色编辑器代码
class CustomColorEditor : ColorEditor
{
private static Color[] Colors;
static CustomColorEditor()
{
Colors = new Color[]{
Color.Red, Color.Green, Color.Blue, Color.White,
Color.White, Color.White, Color.White, Color.White,
Color.White, Color.White, Color.White, Color.White,
Color.White, Color.White, Color.White, Color.White,
};
}
public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
var colorEditorObject = this;
Type colorUiType = typeof(ColorEditor).GetNestedType("ColorUI", BindingFlags.NonPublic);
var colorUiConstructor = colorUiType.GetConstructors()[0];
var colorUiField = typeof(ColorEditor).GetField("colorUI", BindingFlags.Instance | BindingFlags.NonPublic);
var colorUiObject = colorUiConstructor.Invoke(new[] { colorEditorObject });
colorUiField.SetValue(colorEditorObject, colorUiObject);
var palField = colorUiObject.GetType().GetField("pal", BindingFlags.Instance | BindingFlags.NonPublic);
var palObject = palField.GetValue(colorUiObject);
var palCustomColorsField = palObject.GetType().GetField("customColors", BindingFlags.Instance | BindingFlags.NonPublic);
palCustomColorsField.SetValue(palObject, Colors);
var selectedValue = base.EditValue(context, provider, value);
Colors = palCustomColorsField.GetValue(palObject) as Color[];
return selectedValue;
}
}
包装代号
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[Guid(GuidList.guidVSPackage1PkgString)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)]
public sealed class VSPackage1Package : Package
{
public VSPackage1Package() { }
protected override void Initialize()
{
base.Initialize();
TypeDescriptor.AddAttributes(typeof(Color), new EditorAttribute(typeof(CustomColorEditor), typeof(UITypeEditor)));
}
}
结果
这将是Visual Studio属性窗口中的结果。看看那些Red
,Green
,Blue
在我们添加对话框的底部:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句