You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义UITypeEditor弹出窗口与PropertyGrid单元格对齐?

解决PropertyGrid自定义UITypeEditor弹窗对齐问题

我来帮你搞定这个弹窗对齐的问题!默认颜色编辑器的对齐效果确实很实用,要实现同样的效果,核心是要拿到PropertyGrid对应单元格的屏幕位置,下面给你两种可行的思路:

思路一:通过反射获取单元格位置

虽然PropertyDescriptorGridEntry的公开属性里没有直接的坐标信息,但我们可以借助反射拿到它内部关联的GridItem对象,进而获取单元格的Bounds:

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
    var editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
    if (editorService == null) return value;

    // 从context拿到PropertyDescriptorGridEntry实例
    var gridEntry = context.Instance as PropertyDescriptorGridEntry;
    if (gridEntry != null)
    {
        // 反射获取内部的GridItem属性
        var gridItemProp = gridEntry.GetType().GetProperty(
            "GridItem", 
            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var gridItem = gridItemProp?.GetValue(gridEntry) as GridItem;
        
        if (gridItem != null)
        {
            var propertyGrid = gridItem.PropertyGrid;
            // 获取单元格在屏幕上的位置
            var cellScreenPos = propertyGrid.PointToScreen(gridItem.Bounds.Location);
            var cellWidth = gridItem.Bounds.Width;

            // 创建弹窗并设置对齐位置(和默认颜色编辑器一致,右上角对齐单元格右下角)
            var form = new MyEditorForm(true);
            form.StartPosition = FormStartPosition.Manual;
            form.Location = new Point(cellScreenPos.X + cellWidth, cellScreenPos.Y);

            if (form.ShowDialog() == DialogResult.OK)
            {
                value = form.Items;
            }
        }
    }
    return value;
}

这种方式利用了.NET框架内部的对象关联,在大多数.NET Framework版本中都能稳定工作,唯一需要注意的是如果未来框架内部结构变更,可能需要调整反射的属性名称。

思路二:使用开源替代PropertyGrid控件

如果不想依赖反射,也可以考虑一些成熟的免费开源PropertyGrid替代控件,它们原生支持更灵活的编辑器布局控制:

  • PropertyGridEx:开源扩展控件,提供了直接获取单元格位置的API,完全兼容原有UITypeEditor逻辑
  • ExtendedPropertyGrid:NuGet可直接安装,自带编辑器对齐的相关配置,文档也比较完善

效果验证

调整后你的自定义编辑器弹窗就能像默认颜色编辑器那样,精准对齐到对应的PropertyGrid单元格右侧,和你期望的示例图效果一致。

内容的提问来源于stack exchange,提问作者Heinz Kessler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:19:52