在WPF程式中實現PropertyGrid功能

老码识途呀發表於2024-11-23

使用C#開發過Windows Forms的都知道,在Windows Forms程式中,有一個PropertyGrid控制元件,可以用於顯示物件的屬性,在WPF中並沒有預設提供此功能的控制元件,今天以一個簡單的小例子,簡述在WPF中藉助WinForm的PropertyGrid實現屬性列表功能,僅供學習分享使用,如有不足之處,還請指正。

涉及知識點

  • PropertyGrid 是.NET中屬性瀏覽器的核心,PropertyGrid控制元件顯示任何物件或型別的屬性,並檢索項的屬性。PropertyGrid一般用在Windows Forms程式中,在WPF程式中,可以透過自定義控制元件實現,也可以藉助WindowsFormsHost控制元件,將Windows Forms中的控制元件,宿主到WPF程式中。
  • WindowsFormsHost,一個WPF控制元件,允許允許在 WPF 程式上託管 Windows Forms控制元件。反過來,若要在 Windows 窗體控制元件或窗體中承載 WPF 元素,請使用 控制元件 ElementHost 。

PropertyGrid簡介

PropertyGrid最常用屬性,如下所示:

  • SelectedObject,設定PropertyGrid控制元件選擇的物件,賦值後,控制元件將顯示物件所有public修飾的屬性。
  • SelectedObjects,設定PropertyGrid控制元件顯示的物件列表,為陣列型別。賦值後,將顯示所有物件公共的public修飾的屬性。

除了上述兩個最常用屬性,PropertyGrid還有其他屬性,如下所示:

  • BackColor 更改其背景色。
  • HelpBackColor 更改助視窗背景色。
  • HelpForeColor 更改助視窗字型顏色。
  • HelpVisible 顯示隱藏幫助視窗。
  • ToolbarVisible 顯示隱藏工具欄。
  • LargeButtons 顯示大型工具欄按鈕。
  • PropertySort 按字母順序對屬性進行排序。
  • BackColor 更改拆分器顏色。
  • LineColor 更改網格線和邊框。

PropertyGrid支援的物件屬性註解,如下所示:

  • DescriptionAttribute - 設定屬性在屬性下方的說明幫助窗格中顯示的屬性的文字。 這是為具有焦點的活動屬性提供幫助文字的有用方法。 將此屬性應用於 MaxRepeatRate 該屬性。
  • CategoryAttribute 設定屬性在網格中所屬的類別。 當需要按類別名稱分組的屬性時,這非常有用。 如果屬性未指定類別,則會將其分配給 Misc 類別。 將此屬性應用於所有屬性。
  • BrowsableAttribute – 指示屬性是否顯示在網格中。 如果要從網格中隱藏屬性,這非常有用。 預設情況下,公共屬性始終顯示在網格中。 將此屬性應用於 SettingsChanged 該屬性。
  • ReadOnlyAttribute – 指示屬性是否為只讀。 如果要使屬性在網格中不可編輯,這非常有用。 預設情況下,具有 get 和 set 訪問器函式的公共屬性在網格中可編輯。 將此屬性應用於 AppVersion 該屬性。
  • DefaultValueAttribute – 標識屬性的預設值。 如果想要為屬性提供預設值,然後確定該屬性的值是否不同於預設值,則這非常有用。 將此屬性應用於所有屬性。
  • DefaultPropertyAttribute – 標識類的預設屬性。 類的預設屬性在網格中選擇類時首先獲取焦點。 將此屬性應用於 AppSettings 類。
  • DisplayNameAttribute - 實際顯示的名稱

透過上述註解,可以顯示屬性在PropertyGrid中的說明或者其他內容。

PropertyGrid控制元件目前支援.NET Framework和Windows Desktop版本,如下所示:

在WPF程式中實現PropertyGrid功能

開發步驟

1. 檢查類庫

首先檢查專案中是否引用【Microsoft.WindowsDesktop.App】框架,在此框架中,會包含【System.Windows.Forms】,若沒有,需要手動新增,如下圖所示:

在WPF程式中實現PropertyGrid功能

2. 引用名稱空間

在專案中需要新增PropertyGrid的頁面,新增System.Windows.Forms名稱空間,如下所示:

<Window x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HelloWorld"
        xmlns:winfm="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
</Window>

3. 新增PropertyGrid控制元件

由於PropertyGrid是Winodws Forms中的控制元件,並不能在WPF中直接使用,需要託管到WindowsFormsHost中才能正確顯示,如下所示:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Button x:Name="btnHelloWorld" Content="Click Say Hello World"
            Width="150" Height="30" Click="btnHelloWorld_Click"></Button>
    <WindowsFormsHost Grid.Column="1" Margin="18,12,0,0" Name="windowsFormsHost1" VerticalAlignment="Top">
        <winfm:PropertyGrid x:Name="propertyGrid"></winfm:PropertyGrid>
    </WindowsFormsHost>
</Grid>

4. 設定物件

透過SelectedObject屬性為PropertyGrid賦值,由於PropertyGrid屬性並不是WPF中的依賴物件,所以不能進行繫結,但可以透過後臺C#程式碼進行賦值。如下所示:

定義測試類Person

public class Person
{
    [Category("Person")]
    [DisplayName("標識")]
    [Description("唯一標識")]
    public int Id { get; set; }

    [Category("Person")]
    [DisplayName("名稱")]
    [Description("名稱")]
    public string Name { get; set; }

    [Category("Person")]
    public string Title { get; set; }

    [Category("Person")]
    public string Description { get; set; }

    [Category("Person")]
    public int Age { get; set; }
}

宣告Person物件並賦值給PropertyGrid,如下所示:

public MainWindow()
{
    InitializeComponent();
    var p = new Person
    {
        Id = 1,
        Name = "老碼識途",
        Age = 20,
        Description = "這是一個人",
        Title = "老碼識途作者"
        };
    this.propertyGrid.SelectedObject = p;
}

例項演示

透過上述步驟,就可以實現PropertyGrid屬性框的功能,本例將Person的作為要顯示屬性的物件賦值給PropertyGrid,如下所示:

在WPF程式中實現PropertyGrid功能

注意,如果沒有為屬性設定Category,則預設為Misc。

以上就是《在WPF程式中實現PropertyGrid功能》的全部內容,旨在拋磚引玉,一起學習,共同進步。

相關文章