使用.NET 2.0(Windows Forms)控件在WPF中的限制是什么?

6
我想在WPF上启动一个新的应用程序。WPF中的新用户界面需要DataGridView控件和PropertyGrid控件。但貌似这两个控件在WPF中不存在,所以我想使用WindowsFormsHost来托管这两个控件。
然而,如果我这样做,是否有任何限制或者风险需要注意呢?
3个回答

6
主要的限制是,您将失去WPF的所有强大功能:数据绑定控件模板数据模板、无限大小、缩放/旋转、不透明度附加属性等等。这是很多要放弃的东西!您将不得不使用旧的繁琐和容易出错的WinForms技术来编写这些控件,并再次处理所有那些您几年前摆脱的限制。 DataGridView .NET Framework 3.5 sp1有一个DataGrid可能会完成任务,还有一些第三方控件,比如来自Xceed的控件。使用基于WPF的网格允许在网格内完全进行数据绑定、模板化和样式化,如果使用WinForms的DataGridView则不可能实现。 PropertyGrid WPF没有附带PropertyGrid的原因是,使用WPF已经提供的内容可以轻松重新创建它:一个简单的ListBox就可以了,只需要少量的代码后台处理。
使用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上的PropertyGrid。 - Ray Burns

2
首先,对于WPF,有第三方的属性网格数据网格可用。这些通常支持WPF的附加样式功能,并与WPF应用程序更为自然地融合。因此,您不需要回到WinForms,除非第三方或工具包控件真的没有其他选择。
如果你必须回到WinForms,需要注意的主要限制是“空域规则”:WinForms和WPF控件不能重叠。此外,WinForms控件无法参与WPF数据绑定,并且必须使用旧式过程代码进行处理,但是您可以将它们封装在用户控件中以解决这个问题。此外,如果您正在尝试进行花哨的视觉效果,那么它们可能不会与WinForms控件很好地配合使用:如果您在WinForms控件附近执行变换或动画,则空域规则可能会对您造成影响。但对于视觉上简单的应用程序,它们应该可以正常工作。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接