サーチ…
こんにちはリソース
WPFには非常に便利な概念が導入されています:データをリソースとして、コントロールのためにローカルに、ウィンドウ全体にローカルに、またはアプリケーション全体でグローバルに格納する機能。データは、実際の情報からWPFコントロールの階層まで、あなたが望むものであればどんなものでもかまいません。これにより、データを1か所に配置し、それを他の場所から使用することができます。これは非常に便利です。このコンセプトは、スタイルやテンプレートに多く使用されます。
<Window x:Class="WPFApplication.ResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourceSample" Height="150" Width="350">
<Window.Resources>
<sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
</Window.Resources>
<StackPanel Margin="10">
<TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
<TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
</StackPanel>
</Window>
リソースにはx:Key属性を使用してキーが与えられます。この属性を使用すると、このキーを使用してStaticResourceマークアップ拡張と組み合わせてアプリケーションの他の部分から参照できるようになります。この例では、単純な文字列を格納して、2つの異なるTextBlockコントロールから使用します。
リソースタイプ
シンプルな文字列を共有するのは簡単でしたが、もっと多くの作業を行うことができます。この例では、背景に使用するグラデーションブラシとともに、完全な文字列の配列も保存します。これは、あなたがリソースでどれくらいのことをすることができるかというかなり良い考えを与えるはずです。
<Window x:Class="WPFApplication.ExtendedResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ExtendedResourceSample" Height="160" Width="300"
Background="{DynamicResource WindowBackgroundBrush}">
<Window.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
<x:Array x:Key="ComboBoxItems" Type="sys:String">
<sys:String>Item #1</sys:String>
<sys:String>Item #2</sys:String>
<sys:String>Item #3</sys:String>
</x:Array>
<LinearGradientBrush x:Key="WindowBackgroundBrush">
<GradientStop Offset="0" Color="Silver"/>
<GradientStop Offset="1" Color="Gray"/>
</LinearGradientBrush>
</Window.Resources>
<StackPanel Margin="10">
<Label Content="{StaticResource ComboBoxTitle}" />
<ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
</StackPanel>
</Window>
今回は、余分なリソースを追加しました。これで、ウィンドウには単純な文字列、文字列、LinearGradientBrushが追加されました。文字列はラベルに使用され、文字列の配列はComboBoxコントロールの項目として使用され、グラデーションブラシはウィンドウ全体の背景として使用されます。あなたが見ることができるように、リソースとしてかなりのものを保存することができます。
ローカルおよびアプリケーションの幅広いリソース
特定のコントロールに対して特定のリソースだけが必要な場合は、ウィンドウの代わりにこの特定のコントロールにリソースを追加することで、よりローカルにすることができます。これはまったく同じように機能しますが、唯一の違いは、コントロールのスコープの内側からのみアクセスできることです。
<StackPanel Margin="10">
<StackPanel.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
</StackPanel.Resources>
<Label Content="{StaticResource ComboBoxTitle}" />
</StackPanel>
この場合、リソースをStackPanelに追加し、それを子コントロールであるLabelから使用します。 StackPanelの内部の他のコントロールも、これらの子コントロールの子がそれにアクセスできるように、同様に使用できました。しかし、この特定のStackPanelの外部にあるコントロールはアクセスできません。
複数のウィンドウからリソースにアクセスする必要がある場合は、これも可能です。 App.xamlファイルには、ウィンドウやあらゆる種類のWPFコントロールと同様のリソースが含まれていて、App.xamlに保存すると、プロジェクトのすべてのウィンドウとユーザーコントロールでグローバルにアクセスできます。これは、ウィンドウからの保存と使用の場合とまったく同じように機能します。
<Application x:Class="WpfSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
StartupUri="WPFApplication/ExtendedResourceSample.xaml">
<Application.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
</Application.Resources>
</Application>
それを使用することも同じです - WPFは自動的にローカルコントロールからウィンドウに、次にApp.xamlにスコープを上げて、特定のリソースを探します:
<Label Content="{StaticResource ComboBoxTitle}" />
コードビハインドからのリソース
この例では、コードビハインドから、それぞれ異なるスコープに格納された3つの異なるリソースにアクセスします
App.xaml:
<Application x:Class="WpfSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
StartupUri="WPFApplication/ResourcesFromCodeBehindSample.xaml">
<Application.Resources>
<sys:String x:Key="strApp">Hello, Application world!</sys:String>
</Application.Resources>
</Application>
窓:
<Window x:Class="WpfSamples.WPFApplication.ResourcesFromCodeBehindSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourcesFromCodeBehindSample" Height="175" Width="250">
<Window.Resources>
<sys:String x:Key="strWindow">Hello, Window world!</sys:String>
</Window.Resources>
<DockPanel Margin="10" Name="pnlMain">
<DockPanel.Resources>
<sys:String x:Key="strPanel">Hello, Panel world!</sys:String>
</DockPanel.Resources>
<WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10">
<Button Name="btnClickMe" Click="btnClickMe_Click">Click me!</Button>
</WrapPanel>
<ListBox Name="lbResult" />
</DockPanel>
</Window>
コードビハインド:
using System;
using System.Windows;
namespace WpfSamples.WPFApplication
{
public partial class ResourcesFromCodeBehindSample : Window
{
public ResourcesFromCodeBehindSample()
{
InitializeComponent();
}
private void btnClickMe_Click(object sender, RoutedEventArgs e)
{
lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString());
lbResult.Items.Add(this.FindResource("strWindow").ToString());
lbResult.Items.Add(Application.Current.FindResource("strApp").ToString());
}
}
}
あなたが見るように、私たちは3つの異なる "Hello、world!"を保存します。メッセージ:App.xamlに1つ、ウィンドウの内側に1つ、メインパネルにローカルに1つ。インターフェイスは、ボタンとListBoxで構成されます。
コードビハインドでは、ボタンのクリックイベントを処理します。このイベントでは、スクリーンショットに表示されているように、それぞれのテキスト文字列をListBoxに追加します。 FindResource()メソッドを使用してリソースをオブジェクトとして返します(見つかった場合)。次にToString()メソッドを使用してリソースを認識した文字列に変換します。
異なるスコープでFindResource()メソッドを使用する方法に注目してください。最初はパネル上、次にウィンドウ上、そして現在のApplicationオブジェクト上で。既にわかっているリソースを探すのは理にかなっていますが、すでに述べたように、リソースが見つからなければ、検索は階層を上っていくので、原則として、パネルのFindResource()メソッドを使用することができます。すべての3つのケースは、ウィンドウまで続いていて、アプリケーションレベルまでは見つからなかったためです。
これとは逆ですが、検索はツリーをナビゲートしませんので、アプリケーションレベルでリソースを探すことはできません(コントロールやウィンドウ用にローカルに定義されている場合)。