C# 在PropertyGrid中使用自定义颜色选择器对话框

C# 在PropertyGrid中使用自定义颜色选择器对话框,c#,propertygrid,C#,Propertygrid,在PropertyGrid中,不允许设置颜色的alpha值 我已经制作并希望在PropertyGrid中使用它,但不确定如何使用。要与PropertyGrid交互,您必须创建自己的“property类”()。您可以定制不同的部件,因此有多种解决方案满足您的需求。作为解决问题的第一种方法,这里有一个propertyGrid1的代码: Property curProperty = new Property(); propertyGrid1.SelectedObject = curProperty;

在PropertyGrid中,不允许设置颜色的alpha值


我已经制作并希望在PropertyGrid中使用它,但不确定如何使用。

要与
PropertyGrid
交互,您必须创建自己的“property类”()。您可以定制不同的部件,因此有多种解决方案满足您的需求。作为解决问题的第一种方法,这里有一个
propertyGrid1
的代码:

Property curProperty = new Property();
propertyGrid1.SelectedObject = curProperty;
其中,
属性
由以下内容定义:

public class Property
{
    private ColorDialog _dialog = new customColorDialogDialog();

    public ColorDialog dialog
    {
        get { return _dialog; }
        set { _dialog.ShowDialog(); }
    }
}
class customColorDialogDialog : ColorDialog
{

}

在此代码中,单击属性名称(“对话框”)右侧的单元格时会触发颜色对话框(
customColorDialogDialog
)。

要与
PropertyGrid
交互,必须创建自己的“属性类”()。您可以定制不同的部件,因此有多种解决方案满足您的需求。作为解决问题的第一种方法,这里有一个
propertyGrid1
的代码:

Property curProperty = new Property();
propertyGrid1.SelectedObject = curProperty;
其中,
属性
由以下内容定义:

public class Property
{
    private ColorDialog _dialog = new customColorDialogDialog();

    public ColorDialog dialog
    {
        get { return _dialog; }
        set { _dialog.ShowDialog(); }
    }
}
class customColorDialogDialog : ColorDialog
{

}

在此代码中,当单击属性名称(“对话框”)右侧的单元格时,会触发颜色对话框(
customColorDialogDialog
)。

我设法在属性网格中使用自定义颜色选择器对话框,并将其代码复制到此处,以防某些人也需要它:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace HelpersLib
{
    public class MyColorEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            if (value.GetType() != typeof(RGBA))
            {
                return value;
            }

            IWindowsFormsEditorService svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

            if (svc != null)
            {
                using (DialogColor form = new DialogColor((RGBA)value))
                {
                    if (svc.ShowDialog(form) == DialogResult.OK)
                    {
                        return form.NewColor.RGBA;
                    }
                }
            }

            return value;
        }

        public override bool GetPaintValueSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override void PaintValue(PaintValueEventArgs e)
        {
            using (SolidBrush brush = new SolidBrush((RGBA)e.Value))
            {
                e.Graphics.FillRectangle(brush, e.Bounds);
            }

            e.Graphics.DrawRectangleProper(Pens.Black, e.Bounds);
        }
    }
}
这就是它在属性网格中的外观:

当我点击它的按钮时,它会打开

但还有一个问题我无法解决。 我无法将颜色结构与此UITypeEditor一起使用,因此创建了RGBA类。 当我使用color struct时,它如下所示:


我想我会为它打开另一个问题:

我设法在属性网格中使用我的自定义颜色选择器对话框,并在这里复制它的代码,以防一些人也需要它:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace HelpersLib
{
    public class MyColorEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            if (value.GetType() != typeof(RGBA))
            {
                return value;
            }

            IWindowsFormsEditorService svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

            if (svc != null)
            {
                using (DialogColor form = new DialogColor((RGBA)value))
                {
                    if (svc.ShowDialog(form) == DialogResult.OK)
                    {
                        return form.NewColor.RGBA;
                    }
                }
            }

            return value;
        }

        public override bool GetPaintValueSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override void PaintValue(PaintValueEventArgs e)
        {
            using (SolidBrush brush = new SolidBrush((RGBA)e.Value))
            {
                e.Graphics.FillRectangle(brush, e.Bounds);
            }

            e.Graphics.DrawRectangleProper(Pens.Black, e.Bounds);
        }
    }
}
这就是它在属性网格中的外观:

当我点击它的按钮时,它会打开

但还有一个问题我无法解决。 我无法将颜色结构与此UITypeEditor一起使用,因此创建了RGBA类。 当我使用color struct时,它如下所示:


我想我会为它打开另一个问题:

我喜欢这个图像效果:我不能修改那里的颜色类,因为我也使用这个类来保存,它看起来很糟糕。因此,解决方案必须具有属性。@Jaex我知道您创建了一个自定义ColorDialog(在我的示例代码中继承自ColorDialog),它将图片中引用的类作为其属性之一,不是吗?只要定义了ColorDialog类型的类,您就不需要担心其他任何事情;只需将我的customColorDialog:ColorDialog替换为您的类。@Jaex您能用定义自定义颜色对话框的代码更新您的问题吗?通过这种方式,我可以更清楚地解决您的疑问。这是我的颜色选择器:这是我使用属性网格的地方:您的解决方案对我无效,因为我无法将颜色对话框属性存储在图像效果类中,因为它将保存到我的设置中。即使我可以忽略保存这些图片,但在图像效果类中,每种颜色有5个不同的对话框看起来还是很可怕的。我需要写更多的内容,但有字符限制,所以我无法在这里详细解释。@Jaex您指的是一个自定义颜色对话框,因此我假设它是从基本ColorDialog类生成的。向PropertyGrid添加复杂的自定义控件并不容易。您必须执行自定义实现(如我的链接或上面Hans Passant提供的链接所示)。这个答案的全部要点是给您一些开始提示,因为假设您的控件符合预期条件(ColorDialog)。我希望你已经发现了一些有用的东西,但我不会编辑我的答案来解释你复杂的现实。我喜欢这个图像效果:我不能修改那里的颜色类,因为我也使用这个类来保存,它看起来很糟糕。因此,解决方案必须具有属性。@Jaex我知道您创建了一个自定义ColorDialog(在我的示例代码中继承自ColorDialog),它将图片中引用的类作为其属性之一,不是吗?只要定义了ColorDialog类型的类,您就不需要担心其他任何事情;只需将我的customColorDialog:ColorDialog替换为您的类。@Jaex您能用定义自定义颜色对话框的代码更新您的问题吗?通过这种方式,我可以更清楚地解决您的疑问。这是我的颜色选择器:这是我使用属性网格的地方:您的解决方案对我无效,因为我无法将颜色对话框属性存储在图像效果类中,因为它将保存到我的设置中。即使我可以忽略保存这些图片,但在图像效果类中,每种颜色有5个不同的对话框看起来还是很可怕的。我需要写更多的内容,但有字符限制,所以我无法在这里详细解释。@Jaex您指的是一个自定义颜色对话框,因此我假设它是从基本ColorDialog类生成的。向PropertyGrid添加复杂的自定义控件并不容易。您必须执行自定义实现(如我的链接或上面Hans Passant提供的链接所示)。这个答案的全部要点是给您一些开始提示,因为假设您的控件符合预期条件(ColorDialog)。我希望你们已经发现了一些有用的东西,但我不会修改我的答案来解释你们复杂的现实。