【问题标题】:Limitations of using .NET 2.0 (Windows Forms) controls in WPF?在 WPF 中使用 .NET 2.0(Windows 窗体)控件的限制?
【发布时间】:2009-11-12 06:42:32
【问题描述】:

我想在WPF 上启动一个新应用程序。 WPF 中的新用户界面需要 DataGridView 控件和 PropertyGrid 控件。但看起来这两个控件在 WPF 中不存在,我想使用 WindowsFormsHost 托管这两个控件。

但是,如果我这样做,有人预见到这种方法有什么限制吗?

【问题讨论】:

    标签: wpf datagridview wpf-controls wpftoolkit propertygrid


    【解决方案1】:

    主要限制是您失去了 WPF 的所有强大功能:Data bindingControlTemplatesDataTemplates、无限大小、缩放/旋转、OpacityAttached Properties,仅举几例。放弃的太多了!您必须使用旧的乏味且容易出错的 WinForms 技术对这些控件进行编程,并再次处理您多年前摆脱的所有这些限制。

    数据网格视图

    NET Framework 3.5 sp1 有一个DataGrid 可以完成这项工作,并且有几个第三方控件可以做到这一点,例如来自 Xceed 的控件。使用基于 WPF 的网格可以在网格内实现完整的数据绑定、模板化和样式化,而这在使用 WinForms 的 DataGridView 时是不可能的。

    属性网格

    WPF 不附带PropertyGrid 的原因是,使用 WPF 已经提供的功能重新创建非常容易:一个简单的列表框就可以了,样式正确,只需要几行代码隐藏。

    使用 WPF PropertyGrid 实现的美妙之处在于,您可以使用模板来呈现您正在编辑的属性,最重要的是,您可以通过在 XAML 中使用一些绑定来表达它们来添加新的属性编辑器。例如,我们的一个属性网格中的一些属性是用滑块设置的,只需大约五行 XAML 就可以做到这一点。

    以下代码说明了在 WPF 中实现 PropertyGrid 背后的关键概念:

    public class PropertyGrid
    {
      ...
      public static readonly DependencyProperty SelectedObjectProperty = ...
      {
        PropertyChangedCallback = (obj, e) =>
        {
          PropertyItems =
            from pi in SelectedObject.GetType().GetProperties()
            select new PropertyGridItem { Object = SelectedObject, PropertyInfo = pi };
        }
      }
    }
    
    public class PropertyInfo
    {
      public object Object;
      public PropertyInfo PropertyInfo;
      public object Value
      {
        get { return PropertyInfo.GetValue(Object); }
        set { PropertyInfo.SetValue(Object, value); }
      }
      public string Category
      {
        get
        {
          return (
            from attrib in PropertyInfo.GetCustomAttributes().OfType<CategoryAttribute>()
            select attrib.Name
          ).FirstOrDefault();
        }
      }
    }
    

    有了这个,用几行 XAML 复制 PropertyGrid 的整个外观和感觉非常快速和容易:只需使用按类别分组的 ListBox,以及由 DockPanel 组成的 ItemTemplate包含绑定到属性名称的固定宽度TextBlock 和用于打印属性编辑器的ContentPresenter

    【讨论】:

    • 虽然我概述了我们使用的本土 PropertyGrid,但您可能还想查看 Franci Penov 在 CodePlex 上提到的那个。
    【解决方案2】:

    首先,WPF 有第三方 property gridsdata grids,它们通常支持 WPF 的附加样式功能,并且更符合 WPF 应用程序的习惯。所以你不需要回到 WinForms,除非第三方或工具包控件真的不是一个选项,否则可能不应该这样做。

    如果您必须退回到 WinForms,需要注意的主要限制是“空域规则”:您不能让 WinForms 和 WPF 控件相互重叠。另外,当然 WinForms 控件不能参与 WPF 数据绑定,并且必须使用 old-skool 程序代码来解决,尽管您可以将它们封装在用户控件中以解决这个问题。此外,如果您尝试制作精美的视觉效果,那么它们可能无法很好地与 WinForms 控件配合使用:如果您在 WinForms 控件附近进行转换或动画,那么空域规则可能会咬住您。但对于视觉上简单的应用程序,它们应该可以正常工作。

    【讨论】:

      【解决方案3】:

      WPF Toolkit 中有一个 Datagrid 控件。 CodePlex 上还有第三方 PropertyGrid control(在非常宽松的 MS-PL 许可下)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多