PR

[C#][WPF]リソースとStaticResourceの使い方

C#

WPFでは、複数のUI要素で1つのリソース定義を共有するための仕組みがあります。

これにより、たくさんの画面があっても各画面のUIの統一を図ることができるようになります。

リソースとStaticResourceの使い方をしっかりとマスターしていきましょう。

リソースとは

WPFでは、複数のUI要素で1つのオブジェクトを共有するための仕組みがあり、それをリソースと呼んでいます。

例えば、複数のボタンがあり、それぞれに同じ背景色を設定する場合、背景色の変更のたびに全てのボタンの背景色を再設定していたのでは、手間が増えますし、間違いのもとにもなります。

リソースを定義しておくと、1つの定義を複数のコントロールで共有できるため、変更が生じた場合も1か所を変更するだけですべてのコントロールに反映することが出来るようになります。

StaticResourceとは

StaticResourceとは、定義されたリソースをコントロール等に設定する際に使用するキーワードです。リソース名を与えることで定義したリソースを反映することが出来ます。

これは実際に例をみながら覚えていきましょう。

リソース定義の書き方

リソースの定義は Window.Resources で囲って、その中に必要な定義を記述します。

※ “Window.Resources”は例です。”Window” の部分は、親要素に合わせて、適宜変更してください。

色を定義する

色の定義を行う場合は SolidColorBrush に対して、Key と Color を設定します。

Key には、リソースの定義名を設定します。分かりやすい名前を付けてあげれば OK です。

Color には、カラーコード もしくは 色名称 を指定します。

<Window.Resources>
    <SolidColorBrush x:Key="numbersColor" Color="#666666"/>
    <SolidColorBrush x:Key="operatorsColor" Color="Green"/>
</Window.Resources>

Style を定義する

コントロールのスタイルをあらかじめ定義しておくことも出来ます。

下記ではボタンのスタイルを定義しています。

<Window.Resources>
    <Style x:Key="ButtonStyle" TargetType="Button">
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>

        <Setter Property="Background" Value="LightBlue"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Padding" Value="5,0,5,0"/>
    </Style>
</Window.Resources>

リソースを使う側の書き方

リソースを使う側はStaticResourceキーワードで、リソースのKeyを指定します。

Background="{StaticResource operatorsColor}"

<Button Style="{StaticResource ButtonStyle}">
</Button>

複数の画面で定義を共有したいとき

Window.Resourcesを定義すると、複数のUI要素に同じ定義を反映することが可能ですが、他の画面からは参照できないため、同じ定義を複数の画面で共有したい場合は問題が生じます。

各画面でWindow.Resourcesを定義してしまうと、背景色に関する定義が、画面ごとに記述されてしまい、アプリケーション全体で統一した色設定ができなくなってしまいます。

その場合は、WPFプロジェクトを作成したときに自動生成されるApp.xamlファイルに記述することで、プロジェクト内のすべての画面から参照することが可能となります。

App.xamlファイルのApplication.Resourcesエリアにリソースを定義します。
Window.ResourcesからApplication.Resourcesに変わっています。

<Application.Resources>
    <SolidColorBrush x:Key="backgroundColor" Color Orange"/>
    <SolidColorBrush x:Key="foregroundColor" Color="White"/>
</Application.Resources>

リソースを定義する場所が違うだけで、リソースを使う側の書き方は変わりません。

コメント

タイトルとURLをコピーしました