winforms 如何覆盖ColorEditor类的ColorUI类并添加一个带有自定义颜色的新选项卡?

vs3odd8k  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(259)

我尝试做的是将具有自定义颜色的自定义选项卡添加到ColorEditorclassColorUIclass中,该选项卡出现在controlsPropertyGrid中。
大概是这样的:(* 只是用Photoshop制作的假图像 *)。

我知道,在某种程度上,我必须创建自己的ColorEditorclassoverrideColorUIclass嵌套在原始ColorEditorclass内,但我不知道我必须将哪个Method添加到override,以便添加额外的Tab等。
你知道吗?

bttbmeg0

bttbmeg01#

可能一个更灵活(和更少黑客)的解决方案将是重新创建Jimi提到的ColorEditor。我也可能采取完全不同的方法来支持主题颜色,例如创建主题扩展程序提供程序组件,或创建派生控件或其他可能的解决方案。
无论如何,为了支持我的previous post,特别是我提到的'* 您甚至可以添加另一个标签到编辑器. *',在这里我发布了一个示例代码来添加另一个标签到颜色编辑器,然后您可以看到自定义标签与您需要的自定义颜色,如下所示:

这是一真实的截图;)并不完全是你所要求的,但作为一个示例代码已经足够好了。例如,如果你需要为颜色使用自定义名称,那么你需要在DrawItem中进行更多的自定义,或者从头重新编写控件。
代码如下:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
public class CustomColorEditor : ColorEditor
{
    public override object EditValue(ITypeDescriptorContext 
        context, System.IServiceProvider provider, object value)
    {
        //Get required types and methods
        var ColorUIType = typeof(ColorEditor).GetNestedType("ColorUI", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        var ColorUiConstructor = ColorUIType.GetConstructors()[0];
        var ColorEditorListBoxType = ColorUIType.GetNestedType("ColorEditorListBox", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        var ColorUiField = typeof(ColorEditor).GetField("colorUI", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        var OnListClickMethod = ColorUIType.GetMethod("OnListClick", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        var OnListDrawItemMethod = ColorUIType.GetMethod("OnListDrawItem", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        var OnListKeyDownMethod = ColorUIType.GetMethod("OnListKeyDown", 
            BindingFlags.NonPublic | BindingFlags.Instance);

        //Color UI Control
        var colorUi = (Control)ColorUiConstructor.Invoke(new[] { this });
        ColorUiField.SetValue(this, colorUi);

        //Custom colors ListBox
        var listBox = (ListBox)Activator.CreateInstance(ColorEditorListBoxType);
        //Colors
        listBox.Items.AddRange(new object[] { Color.Red, Color.Green, Color.Blue });
        listBox.DrawMode = DrawMode.OwnerDrawFixed;
        listBox.BorderStyle = BorderStyle.FixedSingle;
        listBox.IntegralHeight = false;
        listBox.Sorted = false;
        listBox.Click += (sender, e) => 
            OnListClickMethod.Invoke(colorUi, new[] { sender, e });
        listBox.DrawItem += (sender, e) => 
            OnListDrawItemMethod.Invoke(colorUi, new[] { sender, e });
        listBox.KeyDown += (sender, e) => 
            OnListKeyDownMethod.Invoke(colorUi, new[] { sender, e });
        listBox.Dock = DockStyle.Fill;

        //Add the custom tab page, including the custome colors
        var tabControl = colorUi.Controls.OfType<TabControl>().First();
        var customTabPage = new TabPage();
        customTabPage.Text = "Custom";
        customTabPage.Controls.Add(listBox);
        tabControl.TabPages.Add(customTabPage);
        return base.EditValue(context, provider, value);
    }
}
public class MyControl : Control
{
    [Editor(typeof(CustomColorEditor), typeof(UITypeEditor))]
    public Color MyColor { get; set; }
}

**注意:**它依赖于颜色编辑器的实现详细信息,例如,在.NET 5+中,成员字段名称为“_colorUI”。

相关问题