我想在WPF上启动一个新的应用程序。WPF中的新用户界面需要DataGridView控件和PropertyGrid控件。但貌似这两个控件在WPF中不存在,所以我想使用
然而,如果我这样做,是否有任何限制或者风险需要注意呢?
WindowsFormsHost
来托管这两个控件。然而,如果我这样做,是否有任何限制或者风险需要注意呢?
WindowsFormsHost
来托管这两个控件。数据绑定
、控件模板
和数据模板
、无限大小、缩放/旋转、不透明度
、附加属性
等等。这是很多要放弃的东西!您将不得不使用旧的繁琐和容易出错的WinForms技术来编写这些控件,并再次处理所有那些您几年前摆脱的限制。
DataGridView
.NET Framework 3.5 sp1有一个DataGrid
可能会完成任务,还有一些第三方控件,比如来自Xceed的控件。使用基于WPF的网格允许在网格内完全进行数据绑定、模板化和样式化,如果使用WinForms的DataGridView则不可能实现。
PropertyGrid
WPF没有附带PropertyGrid
的原因是,使用WPF已经提供的内容可以轻松重新创建它:一个简单的ListBox就可以了,只需要少量的代码后台处理。PropertyGrid
实现的优美之处在于,您可以使用模板来呈现正在编辑的属性,最重要的是,您可以通过仅使用几个绑定在XAML中表达它们来添加新的属性编辑器。例如,我们的某些属性是使用滑块设置的,在XAML中只需要大约五行代码就可以实现这一点。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
来打印属性编辑器。