2012-05-01 19 views
3

我一直在嘗試使用System.Windows.Interactivity.Interaction與MS Expression Blend SDK for .NET 4的WPF。問題是我找不到Interaction.Triggers附加屬性那裏。 Interaction類存在,但我只能看到4個成員:Equals,GetBehaviors,GetTriggers,ReferenceEquals。 我看着我的項目中引用System.Windows.Interactivity.dll的屬性,發現路徑是使用WPF中的Interaction.Triggers

「C:\ Program Files文件(x86)的\微軟的SDK \表達\混合。 NETFramework \ V4.0 \庫\ System.Windows.Interactivity.dll」

於是,我開始與ILDisassеmbler這條道路上的文件,發現交互類實際上有附加屬性的觸發,但是屬性被宣佈爲私有!然後,我在Prism SDK的\ Lib \ Desktop目錄中打開了相同的dll,並在那裏找到了相同的情況。這些DLL的版本是2.0.20525.0。還有System.Windows.Interactivity.xml文件與System.Windows.Interactivity dll。其中我發現以下關於TriggersProperty:

此屬性不公開暴露。這會強制客戶端使用GetTriggers和SetTriggers方法訪問 集合,確保集合存在並在使用之前進行設置。

但我沒有找到任何SetTriggers方法。順便說一句,Silverlight的Interaction具有TriggersProperty作爲公共成員。

我見過很多使用WPF的Interaction.Triggers的例子,我假設不應該有任何問題。我究竟做錯了什麼?

回答

4

那麼肯定會有奇怪的事情發生。這裏是我的發現:

  • 從棱鏡4.1使用System.Windows.Interactivity.dll,Interaction.TriggersProperty顯示爲在VS2010中的對象瀏覽器公共場。
  • 相同的程序集顯示TriggersProperty是ILDASM中的專用字段。
  • 使用Blend SDK for .NET 4中的System.Windows.Interactivity.dll,TriggersProperty不會顯示在對象瀏覽器中。
  • 相同的程序集顯示TriggersProperty是ILDASM中的專用字段。

我沒有解釋。但是,我可以說,如果您只是在您的WPF XAML中編寫<i:Interaction.Triggers>並從Prism 4.1引用System.Windows.Interactivity.dll,它就會按預期工作。

我試着檢查一些其他的框架類,看看它是否是ILDASM中的錯誤,但是這些錯誤都帶有正確的訪問修飾符。所以我不知道爲什麼棱鏡版本的作品,但似乎這樣做。我還沒有試過直接的Blend SDK版本,因爲我沒有需要它。

編輯:多一點信息:用Resharper挖掘,我發現Interaction.TriggersProperty不在任何地方使用。但是,Interaction.GetTriggers遍佈我的WPF代碼。所以我敢打賭,有一些XAML綁定反射魔法使這一切工作。我說「魔術」,因爲我不明白。很明顯,Blend SDK人認爲你只應該使用XAML中的Behaviors和Triggers附加屬性,但是Prism人認爲你也應該能夠從代碼中使用它。

+0

我想在第一個或第二個項目符號中有一個錯字。事物不能在對象瀏覽器中公開並且在ILDASM中是私有的,或者它們是兩個不同的庫。 – XanderMK

+1

沒有錯別字。它在對象瀏覽器和ILDASM中以不同的方式顯示。他們肯定是被加載到兩個工具中的相同文件。如果你不相信我,那就試試吧。 –

+0

是的,這有效。我一定是第一次打錯了東西。看起來像Interaction.GetTriggers首先檢查Interaction.Triggers屬性是否已設置,否則設置它。而Interaction.GetTriggers是WPF獲得Interaction.Triggers的唯一合法途徑。順便說一下,出於某種原因,Interaction.Triggers屬性的名稱是「ShadowTriggers」。這在WPF中是真的,對Silverlight沒有把握。 – XanderMK