3

System.Windows.Interactivity.InteractionをMSExpressionBlend SDK for .NET 4のWPFで使用しようとしています。問題は、Interaction.Triggersの添付プロパティが見つからないことです。Interactionクラスは存在しますが、その中にはEquals、GetBehaviors、GetTriggers、ReferenceEqualsの4つのメンバーしか表示されません。プロジェクト内のSystem.Windows.Interactivity.dllへの参照のプロパティを調べたところ、パスが次のようになっていることがわかりました。

"C:\ Program Files(x86)\ Microsoft SDKs \ Expression \ Blend.NETFramework \ v4.0 \ Libraries \System.Windows.Interactivity.dll"

そこで、ILDisassеmblerを使用してそのパスでファイルを開いたところ、Interactionクラスには実際にはTriggersアタッチされたプロパティがありますが、プロパティはプライベートとして宣言されています。次に、PrismSDKの\Lib \ Desktopディレクトリで同じdllを開いたところ、同じ状況が見つかりました。これらのdllのバージョンは2.0.20525.0です。System.Windows.Interactivitydllを含むSystem.Windows.Interactivity.xmlファイルもあります。その中で私はTriggersPropertyについて次のことを見つけました:

このプロパティは公開されていません。これにより、クライアントはGetTriggersメソッドとSetTriggersメソッドを使用してコレクションにアクセスし、コレクションが存在し、使用される前に設定されていることを確認します。

しかし、そこにはSetTriggersメソッドが見つかりませんでした。ところで、SilverlightのインタラクションにはパブリックメンバーとしてTriggersPropertyがあります。

私はInteraction.TriggersをWPFで使用した多くの例を見てきましたが、問題はないと思います。私は何が間違っているのですか?

4

1 に答える 1

5

確かに何か奇妙なことが起こっています。これが私が見つけたものです:

  • Prism 4.1のSystem.Windows.Interactivity.dllを使用すると、Interaction.TriggersPropertyは、VS2010内のオブジェクトブラウザーにパブリックフィールドとして表示されます。
  • 同じアセンブリは、TriggersPropertyがILDASMのプライベートフィールドであることを示しています。
  • Blend SDK for .NET 4のSystem.Windows.Interactivity.dllを使用すると、TriggersPropertyがオブジェクトブラウザーに表示されません。
  • 同じアセンブリは、TriggersPropertyがILDASMのプライベートフィールドであることを示しています。

説明はありません。ただし、<i:Interaction.Triggers>WPF XAMLを記述し、Prism 4.1からSystem.Windows.Interactivity.dllを参照するだけで、期待どおりに機能すると言えます。

他のいくつかのフレームワーククラスをチェックして、それがILDASMのバグであるかどうかを確認しようとしましたが、それらはすべて正しいアクセス修飾子で表示されました。だから、なぜプリズムバージョンが機能するのかわかりませんが、それはまさにそれをしているようです。ストレートアップのBlendSDKバージョンは必要なかったので、試していません。

編集:もう少し情報:Resharperを調べてみると、Interaction.TriggersPropertyがどこにも使用されていないことがわかりました。ただし、Interaction.GetTriggersは私のWPFコード全体で使用されています。したがって、これをすべて機能させるXAMLバインディングリフレクションマジックがあると確信しています。わからないので「魔法」と言います。どうやら、Blend SDKの人々は、XAMLのBehaviors and Triggers添付プロパティのみを使用する必要があると考えていますが、Prismの人々は、コードからも使用できるはずだと考えています。

于 2012-05-01T22:58:53.900 に答える