充分利用 .NET 架構的 PropertyGrid 控制項(微軟)之八

來源:互聯網
上載者:User
控制項|微軟 添加域列表和簡單的下拉式清單屬性支援
對於基於 Enum 類型返回枚舉的屬性,PropertyGrid 會自動在下拉式清單中顯示枚舉值。EnumConverter 也提供了這一功能。對於自己的屬性,您可能希望為使用者提供一個有效值列表(有時也稱為選取列表或域列表),而其類型並不是基於 Enum。如果域值在運行時之前未知,或者值可以更改,則屬於這種情況。

修改選項視窗,提供一個使用者可從中選擇的預設檔案名稱的域列表。您已經將 DefaultFileName 屬性添加到 AppSettings 類。下一步是在 PropertyGrid 中顯示內容的下拉式清單,以提供域列表。

提供簡單的下拉式清單屬性支援
建立一個從類型轉換器類繼承而來的類。由於 DefaultFileName 屬性屬於 String 類型,因此可以從 StringConverter 中繼承。如果屬性類型的類型轉換器不存在,則可以從 TypeConverter 繼承;這裡並不需要。
' Visual Basic

Public Class FileNameConverter
    Inherits StringConverter
End Class

覆蓋 GetStandardValuesSupported 方法並返回 true,表示此對象支援可以從列表中選取的一組標準值。
' Visual Basic

Public Overloads Overrides Function GetStandardValuesSupported( _
                    ByVal context As ITypeDescriptorContext) As Boolean
    Return True
End Function

覆蓋 GetStandardValues 方法並返回填充了標準值的 StandardValuesCollection。建立 StandardValuesCollection 的方法之一是在建構函式中提供一個值數組。對於選項視窗應用程式,您可以使用填充了建議的預設檔案名稱的 String 數組。
' Visual Basic

Public Overloads Overrides Function GetStandardValues( _
                     ByVal context As ITypeDescriptorContext) _
                  As StandardValuesCollection

    Return New StandardValuesCollection(New String() {"新檔案", _
                                                      "檔案1", _
                                                      "文檔1"})
End Function

(可選)如果希望使用者能夠鍵入下拉式清單中沒有包含的值,請覆蓋 GetStandardValuesExclusive 方法並返回 false。這從根本上將下拉式清單樣式變成了組合框樣式。
' Visual Basic

Public Overloads Overrides Function GetStandardValuesExclusive( _
               ByVal context As ITypeDescriptorContext) As Boolean
    Return False
End Function

擁有自己的用於顯示下拉式清單的類型轉換器類後,您需要確定使用該類的目標。在本樣本中,目標為 DefaultFileName 屬性,因為類型轉換器是針對該屬性的。將 TypeConverterAttribute 應用到目標屬性中。
' Visual Basic

' 應用到 DefaultFileName 屬性的 TypeConverter 特性。
<TypeConverter(GetType(FileNameConverter)), _
CategoryAttribute("文檔設定")> _
Public Property DefaultFileName() As String
    Get
        Return _defaultFileName
    End Get
    Set(ByVal Value As String)
        _defaultFileName = Value
    End Set
End Property

再次編譯並運行選項視窗應用程式。下面的螢幕快照顯示了選項視窗目前的外觀。請注意 DefaultFileName 屬性的外觀。

圖 7:在 PropertyGrid 中顯示下拉域列表

為屬性提供自訂 UI
如上所述,.NET 架構類型使用 TypeConverter 和 UITypeEditor 類(以及其他類)來提供 PropertyGrid 編輯支援。有關如何使用 TypeConverter,請參閱對自訂類型的支援一節;您也可以使用 UITypeEditor 類來自訂 PropertyGrid。

您可以在 PropertyGrid 中提供小圖形表示和屬性值,類似於為 Image 和 Color 類提供的內容。要在自訂中執行此操作,請從 UITypeEditor 繼承,覆蓋 GetPaintValueSupported 並返回 true。然後,覆蓋 UITypeEditor.PaintValue 方法,並在自己的方法中使用 PaintValueEventArgs.Graphics 參數繪製圖形。最後,將 Editor 特性應用到使用 UITypeEditor 類的類或屬性。

下面的螢幕快照顯示了結果外觀。

圖 8:在 PropertyGrid 中顯示內容的自訂圖形

您也可以提供自己的下拉式清單控制項,這與 Control.Dock 屬性用來為使用者提供靠接選擇的控制項類似。要執行此操作,請從 UITypeEditor 繼承,覆蓋 GetEditStyle,然後返回一個 UITypeEditorEditStyle 枚舉值,例如 DropDown。您的自訂下拉式清單控制項必須從 Control 或 Control 的衍生類別(例如 UserControl)繼承而來。然後,覆蓋 UITypeEditor.EditValue 方法。使用 IServiceProvider 參數調用 IServiceProvider.GetService 方法,以擷取一個 IWindowsFormsEditorService 執行個體。最後,調用 IWindowsFormsEditorService.DropDownControl 方法來顯示您的自訂下拉式清單控制項。請記住將 Editor 特性應用到使用 UITypeEditor 類的類或屬性中。

下面的螢幕快照顯示了結果外觀。

圖 9:在 PropertyGrid 中顯示內容的自訂下拉式清單控制項

除了使用 TypeEditor 和 UITypeEditor 類外,還可以自訂 PropertyGrid 以顯示其他屬性選項卡。屬性選項卡從 PropertyTab 類繼承而來。如果您使用過 Microsoft Visual C#™ .NET 中的屬性瀏覽器,那麼就可能看到過自訂的 PropertyTab。Events 選項卡(帶有閃電圖形的按鈕)就是一個自訂的 PropertyTab。下面的螢幕快照顯示了自訂 PropertyTab 的另一個樣本。可以使用 PropertyTab 編輯按鈕的邊界點,以建立自訂的按鈕形狀。

圖 10:在 PropertyGrid 中顯示自訂選項卡

有關使用 UITypeEditor 類自訂 PropertyGrid 的詳細資料,以及上述自訂使用者介面程式碼範例,請參閱 Shawn Burke 的文章 Make Your Components Really RAD with Visual Studio .NET Property Browser(英文)。

小結
.NET 架構提供的 ProperyGrid 控制項具有豐富的編輯功能,您可以使用這些編輯功能來改善您的使用者介面。PropertyGrid 的自訂非常簡單,您可以在任何應用程式中使用這一控制項。此外,由於 Visual Studio .NET 屬性瀏覽器是建立在 PropertyGrid 的基礎之上的,因此您可以使用這些技術提供更豐富的設計時體驗。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。