PropertyGrid コントロールを少し試してみたところ、奇妙な問題に遭遇しました。ビット マスクであるクラスに Uint32 プロパティがあります。そこで、Uint32 を編集可能にするために、32 個のボタンを持つカスタム ドロップダウン UserControl を作成することにしました。クラスは次のとおりです(ボタンクリックハンドラなし):
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 インターフェイスの実装関数です。
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; }
それは機能しますが、コントロールが白い色 (ボタンを含む) で表示され、見た目が正しくありません。理由がわかりません。スクリーンショットへのリンクは次のとおりです。これは、コントロールが実際にどのように見えるかです。誰もがそれを回避する理由と方法について何か考えを持っていますか? フォームを呼び出すこともできますが、ドロップダウンに固執したいと思います。
前もって感謝します!