開発 - イベント処理のためにWPFでリソース辞書の背後にコードを設定することは可能ですか?




wpf 開発 (3)

WPFでリソース辞書の背後にコードを設定することは可能ですか? たとえば、ボタンのユーザーコントロールでは、XAMLで宣言します。 ボタンクリックのイベント処理コードは、コントロールの背後にあるコードファイルで実行されます。 ボタンを使ってデータテンプレートを作成する場合は、リソースハンドラ内のボタンをクリックしてイベントハンドラコードを記述することができます。


Gishu - これは「一般的に奨励されるべきではない」と思われるかもしれませんが、あなたがそれをしたいかもしれない1つの理由があります:

テキストボックスがフォーカスを得るときの標準的な動作は、コントロールがフォーカスを失ったときと同じ位置にキャレットを配置することです。 アプリケーション全体を通して、ユーザーがテキストボックスのすべての内容が強調表示されているテキストボックスに移動したときに、単純なハンドラをリソース辞書に追加すると、そのトリックを行うことが好ましいでしょう。

既定のユーザー対話動作を既定の動作と異なるようにする他の理由は、リソースディクショナリのコードの後ろにあるコードの候補のようです。

アプリケーションの機能に特有のものは、リソース辞書のコードの背後にあるべきではないということに完全に同意する。


XAMLは、コードを含まないオブジェクトグラフを構築するためのものです。
データテンプレートは、カスタムユーザーオブジェクトを画面上でどのように表示するかを示すために使用されます(たとえば、リストボックスアイテムの場合)。ビヘイビアは、データテンプレートの専門領域ではありません。 ソリューションを再描画...


私はあなたがResourceDictionaryのコードビハインドファイルを望んでいることをあなたが求めていると思います。 あなたは完全にこれを行うことができます! 実際には、Windowと同じ方法で行います。

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>






wpf