程式碼中的資源 (WPF .NET)

本總覽著重于如何使用程式碼(而非 XAML 語法)來存取或建立 Windows Presentation Foundation (WPF) 資源。 如需 XAML 語法觀點的一般資源使用方式和資源的詳細資訊,請參閱 xaml 資源的總覽

從程式碼存取資源

如果您在程式碼中要求資源,用來識別 XAML 定義資源的索引鍵也會用來取得特定資源。 從程式碼取出資源的最簡單方式,就是從應用程式中的架構層級物件呼叫 FindResourceTryFindResource 方法。 這些方法之間的行為差異,是找不到要求的索引鍵時,會發生什麼事。 FindResource 引發例外狀況。 TryFindResource 不會引發例外狀況,而 null 是會傳回。 每個方法都會取得資源索引鍵做為輸入參數,並傳回弱類型的物件。

一般而言,資源金鑰是一個字串,但偶爾會有 非字串的使用方式。 程式碼資源解析的查閱邏輯與動態資源參考 XAML 案例相同。 搜尋資源會從呼叫專案開始,然後繼續執行邏輯樹狀結構中的父元素。 查閱會視需要繼續尋找應用程式資源、主題和系統資源。 資源的程式碼要求將會正確地考慮在執行時間期間所發生之資源的變更。

下列程式碼範例示範 Click 以索引鍵尋找資源的事件處理常式,並使用傳回的值來設定屬性。

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(Me.FindResource("RainbowBrush"), Brush)
End Sub

指派資源參考的替代方法是 SetResourceReference 。 這個方法會採用兩個參數:資源的索引鍵,以及在應指派資源值的元素實例上存在之特定相依性屬性的識別碼。 在功能上,這個方法是一樣的,而且優點是不需要對傳回值進行任何轉型。

以程式設計方式存取資源的另一種方式,是以字典的形式存取屬性的內容 Resources 。 資源字典是用來將新的資源新增至現有的集合、查看集合是否已使用指定的索引鍵名稱,以及其他作業。 如果您要以程式碼完全撰寫 WPF 應用程式,也可以在程式碼中建立整個集合,並將資源指派給它。 然後,可以將集合指派給 Resources 專案的屬性。 下一節會說明這點。

您可以使用特定索引鍵做為索引,在任何指定 Resources 的集合內編制索引。 以這種方式存取的資源,不會遵循資源解析的一般執行時間規則。 您只會存取該特定集合。 如果在要求的金鑰上找不到任何有效的物件,資源查閱就不會將資源範圍移至根或應用程式。 不過,此方法在某些情況下恰巧具有效能優點,因為索引鍵的搜尋範圍更加限定。 如需如何直接使用資源字典的詳細資訊,請參閱 ResourceDictionary 類別。

使用程式碼建立資源

如果您想要在程式碼中建立整個 WPF 應用程式,您可能也會想要在程式碼中建立該應用程式中的任何資源。 若要達成此目的,請建立新 ResourceDictionary 的實例,然後使用後續的呼叫 ResourceDictionary.Add ,將所有資源加入至字典。 然後,指派已建立 ResourceDictionary 的,在頁面範圍中出現的專案上設定 Resources 屬性,或 Application.Resources 。 您也 ResourceDictionary 可以將做為獨立物件,而不將它加入至專案。 不過,如果這麼做,您必須依項目索引鍵存取其中的資源,就如同它是泛型字典。 ResourceDictionary未附加至 Resources 專案屬性的,不會當做元素樹狀結構的一部分存在,而且在查閱序列中沒有可供和相關方法使用 FindResource 的範圍。

使用物件做為索引鍵

大多數的資源使用方式會將資源的索引鍵設定為字串。 不過,各種 WPF 功能刻意使用物件類型做為索引鍵,而不是字串。 WPF 樣式和主題支援會使用讓資源以物件類型做為索引鍵的功能。 成為其他非樣式控制項之預設值的樣式和主題,每個都是由應該套用的控制項之所 Type 組成。

以類型為索引鍵提供可靠的查閱機制,可在每個控制項類型的預設實例上運作。 型別可以藉由反映來偵測,並用於設定衍生類別的樣式,即使衍生型別沒有預設樣式也是一樣。 您可以使用X:Type 標記延伸來指定 Type XAML 中定義之資源的索引鍵。 其他支援 WPF 功能的非字串金鑰使用方式有類似的擴充功能,例如 ComponentResourceKey 標記延伸

如需詳細資訊,請參閱 樣式、DataTemplates 和隱含索引鍵

另請參閱