gpt4 book ai didi

c# - Visual Studio 颜色属性编辑器中的自定义调色板

转载 作者:太空狗 更新时间:2023-10-29 18:31:17 24 4
gpt4 key购买 nike

在 Visual Studio 设计器中,在属性窗口下,您可以使用颜色选择器选择 ForeColorBackColor 等。当你想选择一种颜色时,颜色选择器会出现“自定义、Web、系统”选项卡。如果选择自定义,则可以向选择器添加新颜色,但只有底部 2 行可以更改,并且更改不会跨控件持续存在。因此,如果您向调色板添加颜色,当您选择另一个控件并想要更改例如 BackColor 时,您之前添加的颜色不存在。

有没有一种方法可以创建自定义颜色集并将其导入到设计人员的颜色选择器控件中?

注意:这个问题不是在询问 VS 主题,或者颜色是否可以作为代码隐藏中的类来实现。我正在寻找一种定制设计器的方法。

最佳答案

帮助你在visual studio中挑选颜色的编辑器是ColorEditor它不会在不同的控件中保留自定义颜色。要解决这个问题,您应该:

  • 创建自定义 UITypeEditor基于 ColorEditor
  • 在 visual studio 启动时为 Color 类型注册编辑器

这是一个详细的答案,包括我用来解决问题的代码。

创建 CustomColorEditor

ColorEditor 使用私有(private) ColorUI 类来显示私有(private) ColorPalette 控件。调色板使用一组颜色来显示自定义颜色。

为了创建 CustomColorEditor,我派生自 ColorEditor 并使用反射找到这些成员,并使用一些颜色的静态数组填充数组以在首次加载时显示。然后在关闭编辑器后,我从编辑器中获取自定义颜色并将它们放入静态数组中,并在下次加载时使用此静态数组初始化颜色编辑器。通过这种方式,自定义颜色在我的 CustomColorEditor 的所有实例之间共享。

显示 CustomColorEditor 而不是默认的 ColorEditor

要为特定类型的所有属性显示 ui 类型编辑器,您应该添加 Editor类型的属性。但是因为 Color 不是我的类型,我怎么能给它添加 Editor 属性呢?

TypeDescriptor.AddAttributes帮我注册了 Color 类型的编辑器。

我应该在哪里运行代码来注册属性?当然是在 Visual Studio 运行时!

为此,我创建了一个 Visual Studio Package 项目并将注册代码放在包的 Initialize 方法中。我还添加了 ProvideAutoLoad将属性添加到包类以使其在我打开解决方案时自动加载。

然后我安装了包。

然后我使用 gacutil.exe/i "path to dll" 将 dll 放入 GAC。除了 GAC 之外,还可以将 dll 放在 Visual Studio 中 devenv.exe 附近,因为 visual stusio 运行时将使用它来显示所有颜色属性的自定义颜色编辑器。

结论

执行上述任务后,我打开了一个新的 visual studio 实例,在我的 Windows 窗体项目中,我看到我的自定义颜色编辑器显示了颜色。显示我设置的初始颜色。此外,即使在不同的表单之间,颜色编辑器也会保留自定义颜色!

我在这里分享代码。您可以使用想法和代码来增强编辑器。您可以提供自定义颜色以在开始时显示在编辑器中。您甚至可以向编辑器添加另一个选项卡。这是我的代码:

颜色编辑器代码

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 属性窗口中的结果。看看我们添加的对话框底部的 RedGreenBlue:

enter image description here

关于c# - Visual Studio 颜色属性编辑器中的自定义调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35840268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com