Wpf-resources
WPF-リソース
リソースは通常、複数回使用することが予想されるオブジェクトに関連付けられた定義です。 コントロールまたは現在のウィンドウのデータをローカルに保存する機能、またはアプリケーション全体のデータをグローバルに保存する機能です。
オブジェクトをリソースとして定義すると、別の場所からアクセスできます。 つまり、オブジェクトを再利用できるということです。 リソースはリソースディクショナリで定義され、任意のオブジェクトをリソースとして定義して、共有可能なアセットにすることができます。 XAMLリソースに対して一意のキーが指定され、そのキーを使用して、StaticResourceマークアップ拡張機能を使用して参照できます。
リソースには2つのタイプがあります-
- StaticResource
- DynamicResource
StaticResourceはワンタイムルックアップですが、DynamicResourceはデータバインディングのように機能します。 プロパティは特定のリソースキーに関連付けられていることを覚えています。 そのキーに関連付けられたオブジェクトが変更されると、動的リソースはターゲットプロパティを更新します。
例
SolidColorBrushリソースの簡単なアプリケーションを次に示します。
- WPFResouces という名前の新しいWPFプロジェクトを作成しましょう。
- 次のXAMLコードに示すように、2つの四角形をドラッグし、それらのプロパティを設定します。
<Window x:Class = "WPFResources.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:WPFResources"
mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "525">
<Window.Resources>
<SolidColorBrush x:Key = "brushResource" Color = "Blue"/>
</Window.Resources>
<StackPanel>
<Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}"/>
<Rectangle Height = "50" Margin = "20" Fill = "{DynamicResource brushResource}"/>
<Button x:Name = "changeResourceButton"
Content = "_Change Resource" Click = "changeResourceButton_Click"/>
</StackPanel>
</Window>
- 上記のXAMLコードでは、1つの四角形にStaticResourceがあり、もう1つの四角形にDynamicResourceがあり、brushResourceの色がBisqueであることがわかります。
- コードをコンパイルして実行すると、次のMainWindowが生成されます。
[リソースの変更]ボタンをクリックすると、DynamicResourceを含む四角形の色が赤に変わることがわかります。
リソース範囲
リソースは*リソースディクショナリ*で定義されますが、リソースディクショナリを定義できる場所は数多くあります。 上記の例では、リソースディクショナリはウィンドウ/ページレベルで定義されています。 リソースが定義されているディクショナリでは、そのリソースの範囲がすぐに制限されます。 スコープ、つまり リソースを使用できる場所は、定義した場所によって異なります。
- グリッドのリソースディクショナリでリソースを定義すると、そのグリッドとその子要素のみからアクセスできます。
- ウィンドウ/ページで定義すると、そのウィンドウ/ページのすべての要素からアクセスできます。
- アプリのルートはApp.xamlリソースディクショナリにあります。 これはアプリケーションのルートであるため、ここで定義されたリソースはアプリケーション全体にスコープされます。
リソースの範囲に関する限り、ほとんどの場合、アプリケーションレベル、ページレベル、およびグリッド、StackPanelなどの特定の要素レベルです。
上記のアプリケーションには、ウィンドウ/ページレベルのリソースがあります。
リソース辞書
XAMLアプリのリソースディクショナリは、リソースディクショナリが個別のファイルに保持されることを意味します。 これは、ほぼすべてのXAMLアプリで採用されています。 別のファイルでリソースを定義すると、次の利点があります-
- リソースディクショナリでのリソースの定義とUI関連のコードの分離。
- App.xamlなどの個別のファイルですべてのリソースを定義すると、アプリ全体で利用できるようになります。
それでは、別のファイルのリソースディクショナリでリソースをどのように定義するのでしょうか? さて、それは非常に簡単です、次の手順に従ってVisual Studioを介して新しいリソース辞書を追加するだけです-
- ソリューションで、新しいフォルダーを追加し、 ResourceDictionaries という名前を付けます。
- このフォルダーを右クリックし、[サブメニュー項目の追加]から[リソースディクショナリ]を選択して、 DictionaryWithBrush.xaml という名前を付けます。
例
ここで同じ例を取り上げますが、ここではアプリレベルでリソースディクショナリを定義します。 MainWindow.xamlのXAMLコードは次のとおりです-
<Window x:Class = "WPFResources.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:WPFResources"
mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "525">
<StackPanel>
<Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}"/>
<Rectangle Height = "50" Margin = "20" Fill = "{DynamicResource brushResource}"/>
<Button x:Name = "changeResourceButton"
Content = "_Change Resource" Click = "changeResourceButton_Click"/>
</StackPanel>
</Window>
これはDictionaryWithBrush.xamlの実装です-
<ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key = "brushResource" Color = "Blue"/>
</ResourceDictionary>
これはapp.xamlの実装です-
<Application x:Class="WPFResources.App"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri = "MainWindow.xaml">
<Application.Resources>
<ResourceDictionary Source = " XAMLResources\ResourceDictionaries\DictionaryWithBrush.xaml"/>
</Application.Resources>
</Application>
上記のコードをコンパイルして実行すると、次の出力が生成されます-
[リソースの変更]ボタンをクリックすると、四角形の色が赤に変わります。
上記のコードを実行して、いくつかのリソース(背景色など)を試すことをお勧めします。