我想在WPF上启动一个新应用程序。WPF 中的新用户界面需要DataGridView控件和PropertyGrid控件。但看起来这两个控件在 WPF 中不存在,我想使用WindowsFormsHost
.
但是,如果我这样做,是否有人预见到这种方法有任何限制?
我想在WPF上启动一个新应用程序。WPF 中的新用户界面需要DataGridView控件和PropertyGrid控件。但看起来这两个控件在 WPF 中不存在,我想使用WindowsFormsHost
.
但是,如果我这样做,是否有人预见到这种方法有任何限制?
主要限制是您失去了 WPF 的所有强大功能: Data binding
、ControlTemplates
、DataTemplates
、 无限大小 、 缩放/旋转 、Opacity
、Attached Properties
, 仅举几例。放弃的太多了!您将不得不使用旧的乏味且容易出错的 WinForms 技术对这些控件进行编程,并再次处理您多年前摆脱的所有这些限制。
数据网格视图
NET Framework 3.5 sp1 有一个DataGrid
可以完成这项工作,并且有几个第三方控件可以做到这一点,例如来自 Xceed 的控件。使用基于 WPF 的网格允许在网格内完成数据绑定、模板化和样式化,如果使用 WinForms 的 DataGridView,这将是不可能的。
属性网格
WPF 不附带 a 的原因PropertyGrid
是它很容易使用 WPF 已经为您提供的内容重新创建:一个简单的列表框就可以了,适当的样式,只有几行代码隐藏。
使用 WPFPropertyGrid
实现的美妙之处在于您可以使用模板来呈现您正在编辑的属性,最重要的是,您可以通过在 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,以及一个ItemTemplate
包含绑定到属性名称DockPanel
的固定宽度和一个to打印属性编辑器。TextBlock
ContentPresenter
首先,有用于 WPF 的第三方属性网格和数据 网格,它们通常会支持 WPF 的附加样式功能,并且更符合 WPF 应用程序的习惯。所以你不需要回到 WinForms,除非第三方或工具包控件真的不是一个选项,否则你可能不应该这样做。
如果您必须退回到 WinForms,则需要注意的主要限制是“空域规则”:您不能让 WinForms 和 WPF 控件相互重叠。另外,当然 WinForms 控件不能参与 WPF 数据绑定,并且必须使用 old-skool 程序代码来解决,尽管您可以将它们封装在用户控件中以解决这个问题。此外,如果您尝试制作精美的视觉效果,那么它们可能无法很好地与 WinForms 控件配合使用:如果您在 WinForms 控件附近进行转换或动画,那么空域规则可能会咬住您。但是对于视觉上简单的应用程序,它们应该可以正常工作。
WPF Toolkit中有一个 Datagrid 控件。CodePlex上还有一个第三方PropertyGrid 控件(在非常宽松的 MS-PL 许可下)。