Чтобы решить проблему, мы должны переопределить метод EditValue, но сначала мы должны изменить метод GetEditStyle.
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
Теперь давайте переопределим метод EditValue. Там у нас есть много возможностей, которые мы можем использовать.
Пример. Я хочу проверить, есть ли у моей Button ImageList.
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
{
//If it is a Button an his ImageList is empty,
//it doesn't need a Dropdown
if (context.Instance.GetType() == typeof(CButton))
{
CButton button = context.Instance as CButton;
if (button.ImageList == null)
{
return value;
}
}
И теперь нам нужно создать собственную панель. Там мы можем сделать много классных вещей. (Позже больше) Мы отпустим эту панель вниз. (EditorService.DropDownControl (INEP);)
После его закрытия мы должны вернуть выбранное значение. (return inep.EnumValue;)
//Panel with a ImageListBox and my Enum-Items
ImageNameEditorPanel inep = new ImageNameEditorPanel(editorService);
inep.EnumValue = (CImageCollection.Names)value;
editorService.DropDownControl(inep);
return inep.EnumValue;
}
Чтобы создать Panel, который выглядит как DropDown List, я использовал панель и Docked (Fill) DevExpress-Control (ImageListBoxControl) в ней.
Но вы можете сделать это без DexEx. Есть два пути; жесткий и простой способ.
Трудно использовать Imagelist и рисовать вручную изображение и текст.
Легко использовать Treeview и дать ему свой Imagelist. Создайте родительские узлы и установите правильный ImageIndex.
В конструкторе вы должны установить события, чтобы закрыть панель, если что-то было нажато.
Конструктор:
public ImageNameEditorPanel(IWindowsFormsEditorService editorService)
{
InitializeComponent();
this.EditorService = editorService;
this.Size = new Size(Size.Width, Size.Height + 100);
BorderStyle = BorderStyle.None;
[...]
imageListBoxControl1.MouseUp += new MouseEventHandler(lbMouseUp);//Set Value
imageListBoxControl1.SelectedIndexChanged += new EventHandler(lbSelectedIndexChanged);//Close
Controls.Add(imageListBoxControl1);// Don't forget that one! Took me an eternity to figure out...
}
Метод:
void lbMouseUp(object sender, MouseEventArgs e)
{
EditorService.CloseDropDown();
}
Теперь все! Если вы хотите реализовать диалоговое окно, создайте «От» и используйте ShowDialog (форму) вместо DropDownControl (панель).