2013-06-27 118 views
0

我有這個問題,我似乎無法克服。也許有人可以幫忙。比較PropertyPath值

我正在創建一個動態創建DoubleAnimations的方法。我會從數組中爲它提供一組不同的用戶控件,並自動創建DoubleAnimations以添加到StoryBoard。

的事情是,我需要插入兩種類型PropertyPaths的:PlaneProjection.RotationYPropertyControl.OpacityProperty。我必須設置Storyboard.SetTarget對他們不同,所以我需要一種方法來比較我在我的方法中調用TargetProperty的PropertyPath參數。爲了解釋這裏有我想要的代碼做一個部分:

if (TargetProperty == new PropertyPath (PlaneProjection.RotationYProperty)) 
{ 
    // Do some code 
    projection = control.Projection as PlaneProjection; 
    Storyboard.SetTarget(doubleAnimation, projection); 
} 
else if (TargetProperty == new PropertyPath (Control.OpacityProperty)) 
{ 
    Storyboard.SetTarget(doubleAnimation, control); 
} 

我能夠通過使用布爾作爲一種解決方法開關,使我的方法工作,但我還是寧願減少參數的個數在我的方法中,如果可能的話。

我已經嘗試使用:

if (TargetProperty.ToString() == new PropertyPath (PlaneProjection.RotationYProperty).ToString()) 

......還有......

if (TargetProperty.Equals(new PropertyPath (PlaneProjection.RotationYProperty))) 

...但他們沒有工作。任何想法來解決這個問題?難道我做錯了什麼?

在此先感謝!

+0

你需要'control'創建'doubleAnimation',還是僅僅用於'Storyboard.SetTarget'? –

+0

'control'可以是我想要動畫的任何用戶控件。 'projection'就是這個控制器的'PlaneProjection'。是的,它僅用於'Storyboard.SetTarget'。 我的方法最初同時處理控件的平面投影和不透明屬性,但我想我會盡量使它與一個工作,以便我可以減少需要傳遞給它的參數的數量。那是當我注意到這個小怪癖。我一直在考慮再次使用舊的方法,但我認爲知道這是否有任何解決方法會很有趣。 – DeVilFisCh

回答

0

KooKiz建議我使用DependencyObject後,我意識到我可以使用DependencyProperty而不是PropertyPath,然後我嘗試進行比較。正如nmclean所提到的,看起來好像比較PropertyPath物體是不可能的 - 至少在我看來是這樣。我的代碼然後成爲這樣的事情,它現在就像一個魅力:

if (TargetProperty == PlaneProjection.RotationYProperty) 
{ 
    // Do some code 
    projection = control.Projection as PlaneProjection; 
    Storyboard.SetTarget(doubleAnimation, projection); 
} 
else if (TargetProperty == Control.OpacityProperty) 
{ 
    Storyboard.SetTarget(doubleAnimation, control); 
} 
0

首先,難道你不能重新設計系統,使參數只是屬性?做所有你需要做的財產第一,然後生成PropertyPath並將其分配給動畫。

在那之前,你可以嘗試比較`Path`屬性: 如果(TargetProperty.Path ==新的PropertyPath(DependencyProperty的)。路徑)

OK,貌似Path只會如果通過將字符串傳入構造函數來創建PropertyPath,則匹配。

還有另一種方法將它們在WPF相比,但它是不可用在Silverlight:路徑數據是在一個名爲PathParameters數組,這將有其中創建的PropertyPath兩個實例之間的匹配元件由相同的依賴特性傳遞給他們的構造函數。 Silverlight不允許你訪問PathParameters,所以除非有另一個輔助方法(我看着PropertyPathConverter,但它看起來不會有幫助),唯一的選擇(反射除外)是消除比較路徑的需要。

+0

感謝您的建議。不幸的是,這似乎也不起作用。 至於重新設計的系統,原來的方法實際上同時處理投影和不透明屬性,但我想我會讓它只用一個(每個屬性運行兩次),因爲它基本上是做大部分的反正同樣的事情。我已經在考慮回收以前系統的一部分,以便不再需要比較路徑,但正如我在我的帖子下寫到的評論中所述,我認爲知道是否有方法會很有趣圍繞這第一個。 – DeVilFisCh

+0

@DeVilFisCh好吧,我想我已經到了它的底部,但它看起來像你還沒有運氣...看到我的編輯。 – nmclean

+0

幸運的是,KooKiz的回答指出了我的正確方向。我找到了解決我的問題的最簡單的方法 - 使用'DependencyProperty'來代替。我可以對它進行比較,我也可以在'SetTargetProperty'上使用它。不過,謝謝你的建議。 – DeVilFisCh

0

如果您使用的是相同的邏輯來創建在兩種情況下,動畫,直接目標屬性傳遞給你的方法:

public void AssignAnimation(DependencyObject property) 
{ 
    // Create the doubleAnimation 
    // ... 

    // Assign it 
    Storyboard.SetTarget(doubleAnimation, property); 
} 

然後你只需要直接與你的財產稱之爲:

AssignAnimation(control); 
AssignAnimation(control.Projection); 

如果你使用不同的邏輯,那麼我建議只用兩種不同的方法。您的代碼將更易於閱讀和維護。

+0

因爲我需要動畫不同的屬性,我最初使用'PropertyPath'作爲我的方法的參數,然後將其設置爲'SetTargetProperty',但是由於您的回答,我發現我可以使用'DependencyProperty'來代替可以比較的並仍然被設置爲「PropertyPath」。非常感謝! – DeVilFisCh