在WPF中使用.NET 2.0(Windows窗体)控件的局限性?

问题描述:

我想在WPF上启动一个新的应用程序。 WPF中的新用户界面需要DataGridView控制和PropertyGrid控制。但看起来这两个控件在WPF中不存在,我想用WindowsFormsHost来托管这两个控件。在WPF中使用.NET 2.0(Windows窗体)控件的局限性?

但是,如果我这样做,是否有任何限制任何人与这种方法预先?

主要的限制是,你失去了WPF的所有强大功能:Data bindingControlTemplatesDataTemplates,无限大小,缩放/旋转,OpacityAttached Properties,只是仅举几例。这是很多放弃!您必须使用旧的繁琐且容易出错的WinForms技术对这些控件进行编程,并重新处理自己在多年前释放的所有限制。

的DataGridView

NET Framework 3.5 SP1中有一个DataGrid可以做的工作,有几个第三方控件的这个如Xceed之一。使用基于WPF的网格允许在网格内完成数据绑定,模板和样式,如果您使用WinForms的DataGridView,则这是不可能的。

的PropertyGrid

原因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(); 
    } 
    } 
} 

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

+0

虽然我勾画出了我们使用的本土PropertyGrid,但您也可能想看看Franci Penov提到的CodePlex上的一个。 – 2009-11-12 08:51:04

首先,有第三方property gridsdatagrids为WPF,而这些通常将支持WPF的额外的造型能力和适应更加地道与WPF应用程序。所以你不需要退回到WinForms,并且可能不应该除非第三方或工具包控件真的不是一个选项。

如果您必须退回到WinForms,则需要注意的主要限制是“空域规则”:您不能让WinForms和WPF控件相互重叠。此外,当然WinForms控件不能参与WPF数据绑定,并且必须使用old-skool过程代码来解决,尽管您可以将它们封装在用户控件中以解决此问题。另外,如果你正在尝试做一些花哨的视觉效果,那么它们可能不适合WinForms控件:如果你要在WinForms控件附近进行变换或者动画,空域规则可能会让你难以接受。但对于视觉上简单的应用,它们应该可以正常工作

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