【问题标题】:WinForms PropertyGrid behaving unexpectedly in WPF appWinForms PropertyGrid 在 WPF 应用程序中的行为异常
【发布时间】:2014-09-25 16:41:22
【问题描述】:

我正在使用 WinForms PropertyGrid 在 WPF 应用程序中编辑对象属性。但是,PropertyGrid 对于某些属性类型无法按预期工作。具体来说,暴露ColorBrush 类型属性的对象显示为文本,例如#FF000000,并且在@987654326 中单击该类型的单元格时不会出现下拉颜色选择器列表@。据我了解,这些类型存在内置编辑器,我不应该做任何额外的事情来让它工作(如果我错了,请纠正我)。

为简洁起见,我不会包含大量代码,但我只想说一切都是样板文件。我的实现是直接从 MSDN、SO 或网络上漂浮的无数 WPF PropertyGrid 示例中挑选出来的。 PropertyGrid 包裹在 WindowsFormsHost 中,Window 会在用户想要编辑对象时弹出。类似的东西:

`<Window>
    <Grid>
        <WindowsFormsHost>
            <PropertyGrid>
              ...
            </PropertyGrid>
        </WindowsFormsHost>
    </Grid>
</Window>
// BTW everything's implemented in code.

实际对象当然不是直接传递给PropertyGrid,而是包装在自定义PropertyEditorObjects中,它以预定义的方式仅公开那些感兴趣的属性,有时这些PropertyEditorObjects可能会实现ICustomTypeDescriptor ,尤其是当正在编辑的对象具有子对象时,其属性也需要作为嵌套属性暴露给PropertyGrid。一般:

public class PropertyEditorObject
{
    ...

    property bool SomeProperty { get; set; }
    property Size AnotherProperty { get; set; }
    property Brush YetAnotherProperty { get; set; }

    [TypeConverter(typeof(ExpandableObjectConverter))]
    property ContentProperties MoreProperties { get; }
};

public class ContentProperties : ICustomTypeDescriptor
{
    // Implements all the usual ICustomTypeDescriptor stuff.
}
// The PropertyGrid.SelectedObject is set to an instance of the PropertyEditorObject.

除了我在本文开头提到的内容外,一切都有效:某些属性类型(颜色、字体等)仅显示为文本,PropertyGrid 没有为此使用正确的编辑器输入。

我寻求帮助的原因是因为我想使用内置的 WinForms 编辑器,例如 ColorDialogFontDialog 等来编辑这些类型,而不必重新发明轮子,因为我的应用程序仅处于演示阶段。对此问题的任何指导将不胜感激。谢谢。

【问题讨论】:

    标签: wpf propertygrid


    【解决方案1】:

    这是意料之中的。 WinForms 属性网格对 ColorBrushFontFamily 等 WPF 类型一无所知,因此它没有针对它们的自定义编辑器。您是否尝试过第三方 WPF 属性网格之一?我相信Extended WPF Toolkit 有一个。

    【讨论】:

    • 我宁愿提供类型转换器并坚持使用 PropertyGrid,因为它相当健壮且经过时间考验。我已经阅读了 ExtendedWPFToolkit 站点,但还没有下载任何东西,因为我想我会先在这里寻找解决方案。另外,我不确定我是否要负责第三方应用程序的“社区版”,但我会看看。谢谢。
    • 很公平,但是如果你想在 WinForms 属性网格中为 WPF 类型自定义编辑器,你可能最终不得不自己编写它们,这会引发整个“久经考验”面向窗外。
    • 我下载、安装并尝试使用Extended WPF Toolkit 及其PropertyGrid 作为上述问题的解决方案。讨厌这么说,但我得到的正是我付出的。在尝试安装它(有或没有 NuGet)挣扎了几个小时之后,然后一个一个地修复构建错误,因为缺少项目引用,#using 指令 - 如果有的话,其中大部分都没有记录 -用更多未记录的属性等重新装饰我的属性 - 我终于得到它来构建没有错误并运行....
    • ... 只是发现当SelectedObject 属性设置为System.Windows.Shapes 的派生时它会引发异常,例如椭圆。是的孩子们:Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid m_PropertyGrid = new Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid(); m_PropertyGrid.SelectedObject = new Ellipse(); 给出了 System.Reflection.TargetInvocationException 类型的未处理异常......其他 UIElements 似乎工作。现在有多蹩脚?我至少会发送一个错误报告,因为我找不到任何东西。我猜我读到的所有关于没有稳定的 WPF 属性网格的宣传都是真的。
    • Actipro 有一个不错的 PropertyGrid 实现,但它不是免费的。我不确定其他任何人。
    【解决方案2】:

    我的临时解决方案:Install Extended WPF Toolkit Plus,使用 PropertyGrid Plus(具有 SelectedObject*s* 属性)作为编辑器,等待 v2.3 中的“修复”据称将支持更多“类型”(形状,带有火焰的旋转曲线、字母“a”等),与此同时,如果用户尝试编辑不受支持的“类型”,则抛出异常声明 sorry, but you should really send us some money first. 这就是现在的全部内容。一旦我发明了它,就会有更多的讽刺。感谢评论者的建议。涂鸦。

    【讨论】:

    • 哎呀,PropertyGrid Plus 要求您先向他们汇款。 Grrrr....我知道会有一个陷阱!
    • 好吧,既然我的临时解决方案不是没有成本的,我将不得不释放我的“最终解决方案”,在其中我召集所有 Delphi 程序员,将他们放入特殊营地并...... . (哦,那是另一个项目,抱歉)无论如何,我可以选择使用 EWT PropertGrid 的局限性或 WinForms PropertyGrid 及其缺点。如果我选择后者,我可能会选择另一个项目,即全新改进的 WPF PropertyGrid。敬请期待。
    • 有人在 CodeProject codeproject.com/Articles/87715/Native-WPF-PropertyGrid 上发布了原生 WPF PropertyGrid,其中他们使用了 Windows Workflow Foundation 的 PropertyInspector,将其吹捧为“成熟的属性网格”。不幸的是,经过初步测试,它的功能并不比 Winforms PropertyGrid 好。画笔、钢笔等仍显示为文本,并且没有可用的编辑器。我确信可以添加自定义编辑器/转换器,但是这让我重新为 Winforms PropertyGrid 做同样的事情,我已经为几种类型做过。效果很好。
    【解决方案3】:

    解决方案更新:

    1) 使用 Winforms PropertyGrid,如原帖所述,将 EditorAttributes 添加到需要它们的属性中,例如颜色、字体等,打开WinformsColorDialogFontDialog等,进行编辑。需要一些类型转换,但只需要几行代码。不是最好的解决方案,但可行。

    2) 使用Extended WPF Toolkit PropertyGrid。工作,排序,但有局限性。不支持所有类型也不支持多对象选择,即没有 SelectedObjects 属性。第一个问题将在 Toolkit 的 v2.3 中修复。第二种是一种展示停止器,没有编写包装器来促进功能。

    3) 使用Extended WPF Toolkit PlusPropertyGrid Plus。允许多重选择,但仍然受到有限类型选择的影响。此外,花费大 dinero。

    4) 使用 WWF PropertyInspector 作为 WPF PropertyGrid。在纸上看起来不错,但最终的功能并不比 WinForms PropertyGrid 好。需要编辑器/转换器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多