[XAML] ResourceDictionary で定義した内容を static に参照する方法

2023-11-13 (月)

XAML で定義した Resource を static に、C# 側で参照したり、x:static でバインドする方法です。

環境

  • .NET 7.0.403
  • C# 11.0
  • Visual Studio 2022 Version 17.7.6
  • Windows 11 Pro 22H2 22621.2428

結果

定義例

ResourceDirectory に XAML でお好きな定義を書きます。

ResourceSample.xaml の例

<ResourceDictionary x:Class="WpfApplication1.ResourceSample"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfApplication1">

    <Style x:Key="{x:Static local:ResourceSample.ButtonStyleKey}" TargetType="Button">
        <Setter Property="Background" Value="Green" />
    </Style>

</ResourceDictionary>

C# 側で ResourceDictionary を参照して、static プロパティを定義します。
new した後に InitializeComponent() 呼び出しが必要です。

ResourceSample.xaml.cs の例

using System;
using System.Windows;

namespace WpfApplication1;

public sealed partial class ResourceSample
{
    public const string ButtonStyleKey = "ButtonStyle";
    public static Style ButtonStyle { get; }

    static ResourceSample()
    {
        var resource = new ResourceSample();
        resource.InitializeComponent();

        ButtonStyle = resource[ButtonStyleKey] as Style ?? throw new InvalidOperationException();
    }
}

使用例

使用する側は x:static でお好きな場所で参照できます。

MainWindow.xaml の例

<Window x:Class="WpfApplication1.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:local="clr-namespace:WpfApplication1"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        mc:Ignorable="d">

    <Button Style="{x:Static local:ResourceSample.ButtonStyle}" Content="Sample" />

</Window>

感謝

2023-11-13 (月)