如何将弹出编辑器与网格单元格对齐?
How to align popup editor with grid cell?
我有一个 属性 网格和一个使用 UITypeEditor
的自定义编辑器。
我想将其弹出窗口 window 与 属性 网格的单元格对齐,就像 属性 是 Color
时的默认颜色编辑器一样,但我找不到有关的任何信息网格单元的位置和大小。
我的UITypeEditor.EditValue
方法得到一个PropertyDescriptorGridEntry
对象作为context
参数,但是它也没有坐标,它的GridItems
集合是空的。
有人有想法吗? PropertyGrid 是否有(免费)替代品提供此功能
信息?
这是我当前的代码:
class MyPropertyGridEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context )
{
return UITypeEditorEditStyle.Modal;
}
// Displays the UI for value selection.
public override object EditValue(
System.ComponentModel.ITypeDescriptorContext context,
System.IServiceProvider provider,
object value )
{
var form = new MyEditorForm( true );
// ??? Where can I find Location and Size of the grid cell ???
if( form.ShowDialog() == DialogResult.OK )
{
value = form.Items;
}
return value;
}
}
以上是我希望我的表单如何对齐的示例,该示例显示了默认的颜色编辑器。
首先 - 你没有显示弹出对话框。这是两个不同的东西。
PropertyGrid 组件非常复杂,自定义弹出窗口并不像看起来那么容易。
有颜色编辑器的源代码,你可以从中得到启发。
默认行为是保持对齐。正如另一个答案中提到的,您显示的是对话框而不是下拉菜单。
这是一个显示简单下拉列表的示例。您可以将任何控件显示为下拉列表,在此示例中,我显示了 ListBox
:
public class MyComponent : Component
{
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string SampleProperty { get; set; }
}
public class MyUITypeEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
IWindowsFormsEditorService svc;
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
var list = new ListBox();
var items = new[] { "A", "B", "C" };
list.Items.AddRange(items);
list.SelectionMode = SelectionMode.One;
list.SelectedIndex = 0;
if (items.Contains(($"{value}")))
list.SelectedIndex = items.ToList().IndexOf($"{value}");
list.SelectedValueChanged += List_SelectedValueChanged;
svc = provider.GetService(typeof(IWindowsFormsEditorService))
as IWindowsFormsEditorService;
svc.DropDownControl(list);
return list.SelectedItem;
}
private void List_SelectedValueChanged(object sender, EventArgs e)
{
svc.CloseDropDown();
}
}
我有一个 属性 网格和一个使用 UITypeEditor
的自定义编辑器。
我想将其弹出窗口 window 与 属性 网格的单元格对齐,就像 属性 是 Color
时的默认颜色编辑器一样,但我找不到有关的任何信息网格单元的位置和大小。
我的UITypeEditor.EditValue
方法得到一个PropertyDescriptorGridEntry
对象作为context
参数,但是它也没有坐标,它的GridItems
集合是空的。
有人有想法吗? PropertyGrid 是否有(免费)替代品提供此功能 信息?
这是我当前的代码:
class MyPropertyGridEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context )
{
return UITypeEditorEditStyle.Modal;
}
// Displays the UI for value selection.
public override object EditValue(
System.ComponentModel.ITypeDescriptorContext context,
System.IServiceProvider provider,
object value )
{
var form = new MyEditorForm( true );
// ??? Where can I find Location and Size of the grid cell ???
if( form.ShowDialog() == DialogResult.OK )
{
value = form.Items;
}
return value;
}
}
以上是我希望我的表单如何对齐的示例,该示例显示了默认的颜色编辑器。
首先 - 你没有显示弹出对话框。这是两个不同的东西。
PropertyGrid 组件非常复杂,自定义弹出窗口并不像看起来那么容易。
有颜色编辑器的源代码,你可以从中得到启发。
默认行为是保持对齐。正如另一个答案中提到的,您显示的是对话框而不是下拉菜单。
这是一个显示简单下拉列表的示例。您可以将任何控件显示为下拉列表,在此示例中,我显示了 ListBox
:
public class MyComponent : Component
{
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string SampleProperty { get; set; }
}
public class MyUITypeEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
IWindowsFormsEditorService svc;
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
var list = new ListBox();
var items = new[] { "A", "B", "C" };
list.Items.AddRange(items);
list.SelectionMode = SelectionMode.One;
list.SelectedIndex = 0;
if (items.Contains(($"{value}")))
list.SelectedIndex = items.ToList().IndexOf($"{value}");
list.SelectedValueChanged += List_SelectedValueChanged;
svc = provider.GetService(typeof(IWindowsFormsEditorService))
as IWindowsFormsEditorService;
svc.DropDownControl(list);
return list.SelectedItem;
}
private void List_SelectedValueChanged(object sender, EventArgs e)
{
svc.CloseDropDown();
}
}