controls - PropertyGrid 中的自定义下拉编辑器控件以白色显示

标签 controls custom-controls propertygrid

对 PropertyGrid 控件进行了一些运行,现在偶然发现了一个奇怪的问题。 我在一个类中有一个 Uint32 属性,它是一个位掩码。 因此,我决定创建一个带有 32 个按钮的自定义下拉 UserControl,以使 Uint32 可编辑。 这是该类(没有按钮单击处理程序):

class MaskEditorControl : UserControl, IIntegerMaskControl
{
        public MaskEditorControl()
        {
            InitializeComponent();
        }

        public UInt32 ModifyMask(IServiceProvider provider, UInt32 mask)
        {
            IWindowsFormsEditorService editorService = null;
            if (provider != null)
                editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;

            if (editorService != null)
            {
                m_mask = mask;
                checkBox0.CheckState = (m_mask & (1 << 0)) == 0 ? CheckState.Unchecked : CheckState.Checked;
                checkBox1.CheckState = (m_mask & (1 << 1)) == 0 ? CheckState.Unchecked : CheckState.Checked;
                checkBox2.CheckState = (m_mask & (1 << 2)) == 0 ? CheckState.Unchecked : CheckState.Checked;
                editorService.DropDownControl(this);
            }

            return m_mask;
        }
        private UInt32 m_mask = 0;

}

ModifyMask(...) 是从另一个类调用的 IIntegerMaskControl 接口(interface)的实现函数:

public interface IIntegerMaskControl
{
    UInt32 ModifyMask(IServiceProvider provider, UInt32 mask);
}

public class IntegerMaskEditor : UITypeEditor
{
    public static IIntegerMaskControl control = null;

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        if (control == null)
            return "Error: IIntegerMaskControl not set!";

        return control.ModifyMask(provider, (UInt32)value);
    }
}

这是属性本身:

    [System.ComponentModel.CategoryAttribute("Base")]
    [Editor(typeof(IntegerMaskEditor), typeof(UITypeEditor))]
    public UInt32                                   renderMask { get; set; }

它可以工作,但我的控件显示为白色(包括按钮),这看起来不对。我不知道为什么。以下是屏幕截图的链接:that is how the control looks like in action 。 任何人都知道为什么以及如何避免它?我可以调用表单,但我宁愿坚持使用下拉菜单。

提前致谢!

最佳答案

属性网格使用 ViewBackColor属性来显示下拉背景颜色。我没有看到任何其他允许更改下拉背景颜色的属性。

但是,下拉列表中显示的控件的父级是您可以修改的控件(表单),代码如下:

public partial class MaskEditorControl : UserControl, IIntegerMaskControl
{
    private Color _initialBackColor;

    public MaskEditorControl()
    {
        InitializeComponent();
        _initialBackColor = BackColor;
    }

    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);
        if (Parent != null)
        {
            Parent.BackColor = _initialBackColor;
        }
    }
}

关于controls - PropertyGrid 中的自定义下拉编辑器控件以白色显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930176/

相关文章:

c# - 在 C# 和 ASPX 的 ASP.Net 控件中创建属性

asp.net - 检测 JavaScript 在 ASP.NET 中何时被禁用

c# - 为 PropertyGrid 添加工具提示

c# - 如何创建一个属性来存储另一个属性中所选值的索引?

c# - 将数据模板和样式放置到生成的按钮

winforms - .NET/Visual Studio 编辑器中的相对控件位置

c# - 在 DataGridView 列中使用自定义 CheckBoxComboBox

vb.net - 如何在 vb.net 中淡入和淡出自定义面板控件

delphi - 如何在FireMonkey中将自定义列添加到网格项目设计器

.net - 使用 PropertyGrid 设置 PerformanceCounter