WPFでリソースディクショナリの背後にコードを設定することは可能ですか?たとえば、ボタンのユーザーコントロールでは、XAMLで宣言します。ボタンクリックのイベント処理コードは、コントロールの背後のコードファイルで実行されます。ボタンを使用してデータテンプレートを作成する場合、リソースディクショナリ内のボタンクリックのイベントハンドラーコードをどのように記述できますか。
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で遊んでいる場合に備えて、もう1つ注意する点があります。
<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>
x:Class="MyCompany.MyProject.MySubFolder1.MyResourceDictionary"
それ以外の場合、単にx:Class = "MyResourceDictionary"と指定すると、xamlパーサーはクラスを見つけられません。
「ageektrapped」に同意しません...部分クラスのメソッドを使用することは良い習慣ではありません。辞書をページから分離する目的は何でしょうか?
コードビハインドから、次を使用してax:Name要素にアクセスできます。
Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
...
}
カスタムコントロールが読み込まれたときにコントロールに接続する場合は、OnApplyTemplateメソッドでこれを行うことができます。これを行うには、OnApplyTemplateをオーバーライドする必要があります。これは一般的な方法であり、スタイルをコントロールから切り離したままにすることができます。(スタイルはコントロールに依存するべきではありませんが、コントロールはスタイルを持つことに依存するべきです)。
紀州-これは「一般的に奨励されるべきではない慣習」のように思われるかもしれませんが、これはあなたがそれをしたいと思うかもしれない一つの理由です:
テキストボックスがフォーカスを取得したときの標準的な動作は、コントロールがフォーカスを失ったときと同じ位置にキャレットが配置されることです。アプリケーション全体で、ユーザーが任意のテキストボックスにタブで移動したときにテキストボックスのコンテンツ全体が強調表示されるようにしたい場合は、リソースディクショナリに単純なハンドラーを追加するとうまくいきます。
デフォルトのユーザーインタラクションの動作をそのままの動作とは異なるものにしたい他の理由は、リソースディクショナリのコードビハインドの有力な候補のようです。
アプリケーションの機能に固有のものは、リソースディクショナリの背後にあるコードに含めるべきではないことに完全に同意します。
XAMLは、コードを含まないオブジェクトグラフを作成するためのものです。
データテンプレートは、カスタムユーザーオブジェクトを画面に表示する方法を示すために使用されます(リストボックスアイテムの場合など)の動作は、データテンプレートの専門分野の一部ではありません。ソリューションを再描画します...