首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 實現 PropertyGrid 三大方案詳解:從 WindowsFormsHost 到原生 Workflow 設計器控件

     編輯:關於.NET

方案一:宿主 WinForms PropertyGrid

最快上手,三步驟:

  1. 參考 System.Windows.Forms.dll。
  2. XAML 引入命名空間:xmlns:my="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"。
  3. 使用 WindowsFormsHost 包裹。
<WindowsFormsHost Height="287" Width="200">
    <my:PropertyGrid x:Name="PropertyGrid1" />
</WindowsFormsHost>

Button 屬性顯示 設定背景色為紅

方案二:開源 WPF PropertyGrid (WPG)

CodePlex 專案 WPG,純 WPF 控件,無需宿主。

<Window ... xmlns:wpg="clr-namespace:WPG;assembly=WPG">
    <DockPanel>
        <Button x:Name="btn" DockPanel.Dock="Top">button for test</Button>
        <wpg:PropertyGrid DockPanel.Dock="Top" Instance="{Binding ElementName=btn}" />
    </DockPanel>
</Window>

WPG 效果

方案三:整合 WF4.0 原生 PropertyInspectorView(推薦)

Workflow Designer 內建的屬性檢視器即為高階 PropertyGrid,五步驟封裝:

  1. 自訂 WpfPropertyGrid : Grid。
  2. 內含 WorkflowDesigner 私有欄位。
  3. 將 Designer.PropertyInspectorView 加入 Children。
  4. 透過反射取得 RefreshPropertyList、OnSelectionChanged、SelectionTypeLabel。
  5. 實作 SelectedObject 屬性處理選擇變更。
public class WpfPropertyGrid : Grid
{
    private WorkflowDesigner Designer;
    private MethodInfo RefreshMethod, OnSelectionChangedMethod;
    private TextBlock SelectionTypeLabel;
    private object TheSelectedObject;

    public object SelectedObject
    {
        get => TheSelectedObject;
        set
        {
            TheSelectedObject = value;
            if (value != null)
            {
                var context = new EditingContext();
                var mtm = new ModelTreeManager(context);
                mtm.Load(value);
                var selection = Selection.Select(context, mtm.Root);
                OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, new object[] { selection });
                SelectionTypeLabel.Text = value.GetType().Name;
            }
            else
            {
                OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, new object[] { null });
                SelectionTypeLabel.Text = string.Empty;
            }
        }
    }

    public string FontAndColorData
    {
        set => Designer.PropertyInspectorFontAndColorData = value;
    }

    public WpfPropertyGrid()
    {
        Designer = new WorkflowDesigner();
        var inspector = Designer.PropertyInspectorView;
        inspector.Visibility = Visibility.Visible;
        Children.Add(inspector);

        var t = inspector.GetType();
        var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;
        RefreshMethod = t.GetMethod("RefreshPropertyList", flags);
        OnSelectionChangedMethod = t.GetMethod("OnSelectionChanged", flags);
        SelectionTypeLabel = t.GetMethod("get_SelectionTypeLabel", flags).Invoke(inspector, null) as TextBlock;
        SelectionTypeLabel.Text = string.Empty;
    }

    public void RefreshPropertyList() => RefreshMethod.Invoke(Designer.PropertyInspectorView, new object[] { false });
}

原生 PropertyGrid 效果

總結比較

方案優點缺點
WinForms 宿主零學習成本、功能完整跨進程渲染、樣式難統一
WPG 開源控件純 WPF、易客製化社群維護狀態需確認
WF4 PropertyInspector原生高效能、VS 級體驗、支援字型/色彩主題依賴 Workflow 組件、反射較脆弱

完整 Demo 下載:WpfPropertyGrid_Demo.rar

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved