我想在WPF上啓動一個新的應用程序。 WPF中的新用戶界面需要DataGridView控制和PropertyGrid控制。但看起來這兩個控件在WPF中不存在,我想用WindowsFormsHost
來託管這兩個控件。在WPF中使用.NET 2.0(Windows窗體)控件的侷限性?
但是,如果我這樣做,是否有任何限制任何人與這種方法預先?
我想在WPF上啓動一個新的應用程序。 WPF中的新用戶界面需要DataGridView控制和PropertyGrid控制。但看起來這兩個控件在WPF中不存在,我想用WindowsFormsHost
來託管這兩個控件。在WPF中使用.NET 2.0(Windows窗體)控件的侷限性?
但是,如果我這樣做,是否有任何限制任何人與這種方法預先?
主要的限制是,你失去了WPF的所有強大功能:Data binding
,ControlTemplates
和DataTemplates
,無限大小,縮放/旋轉,Opacity
,Attached 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以及包含綁定到屬性名稱的固定寬度TextBlock
的DockPanel
和由ContentPresenter
打印屬性編輯器的ItemTemplate
。
首先,有第三方property grids和datagrids爲WPF,而這些通常將支持WPF的額外的造型能力和適應更加地道與WPF應用程序。所以你不需要退回到WinForms,並且可能不應該除非第三方或工具包控件真的不是一個選項。
如果您必須退回到WinForms,則需要注意的主要限制是「空域規則」:您不能讓WinForms和WPF控件相互重疊。此外,當然WinForms控件不能參與WPF數據綁定,並且必須使用old-skool過程代碼來解決,儘管您可以將它們封裝在用戶控件中以解決此問題。另外,如果你正在嘗試做一些花哨的視覺效果,那麼它們可能不適合WinForms控件:如果你要在WinForms控件附近進行變換或者動畫,空域規則可能會讓你難以接受。但對於視覺上簡單的應用,它們應該可以正常工作
WPF Toolkit中有一個Datagrid控件。 CodePlex上還有第三方PropertyGrid control(根據非常寬鬆的MS-PL許可證)。
雖然我勾畫出了我們使用的本土PropertyGrid,但您也可能想看看Franci Penov提到的CodePlex上的一個。 – 2009-11-12 08:51:04