1. ホーム
  2. wpf

[解決済み] WPFでイベント処理のためにリソース辞書の後ろにコードを設定することは可能ですか?

2022-04-27 16:36:47

質問

WPFでリソース辞書の後ろにコードを設定することは可能ですか?例えば、ボタン用のユーザーコントロールで、あなたはそれをXAMLで宣言します。ボタンクリックのイベント処理コードは、コントロールの背後にあるコードファイル内で行われます。もし、私がボタン付きのデータテンプレートを作成する場合、リソースディクショナリー内のボタンクリックのイベントハンドラーコードをどのように書くことができるでしょうか。

どうすればいいですか?

ご質問の内容は、ResourceDictionaryのコード・ビハインド・ファイルが欲しいということだと思います。これは完全に可能です。実際には、ウィンドウと同じ方法で実行します。

MyResourceDictionaryというResourceDictionaryがあるとします。MyResourceDictionary.xaml ファイルで、ルート要素に x:Class 属性を以下のように記述します。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="MyCompany.MyProject.MyResourceDictionary"
                    x:ClassModifier="public">

次に、MyResourceDictionary.xaml.csというコードビハインドファイルを作成し、以下の宣言をします。

namespace MyCompany.MyProject
{
    partial class MyResourceDictionary : ResourceDictionary
    { 
       public MyResourceDictionary()
       {
          InitializeComponent();
       }     
       ... // event handlers ahead..
    }
}

そして、これで完了です。後ろのコードには、メソッド、プロパティ、イベントハンドラなど、好きなものを入れることができます。

== Windows 10アプリのアップデートについて

と遊んでいると、念のため UWP もうひとつ、注意しなければならないことがあります。

<Application x:Class="SampleProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>

                <!-- This will NOT work -->
                <!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->

                <!-- Create instance of your custom dictionary instead of the above source reference -->
                <rd:MyResourceDictionary />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>