2013-07-24 48 views
2

我有一個用戶控件包含在WPF的父窗口中。用戶控件包含一個按鈕,當按下時,需要回到父窗口並啓動故事板動畫以將UserControl的不透明度設置爲0,同時將不同UserControl的不透明度設置爲1.WPF用戶控制對父窗口對象運行故事板

因此,是我的用戶控件中的一個按鈕,用於隱藏包含的用戶控件並切換到另一個可見的控件。

如果按鈕位於主窗口中,則很容易,因爲第一個用戶控件具有x:左側面板的名稱,第二個面板稱爲leftpanelexpanded。

<DoubleAnimation Storyboard.TargetName="Leftpanel" Storyboard.TargetProperty="Opacity" Duration="0:0:0.2" To="0"/> 
<DoubleAnimation Storyboard.TargetName="Leftpanelexpanded" Storyboard.TargetProperty="Opacity" Duration="0:0:0.2" To="1"/> 

但隨着用戶的控制按鈕,我想不出如何讓這個動畫目標的「leftpanel」和「leftpanelexpanded」用戶控件對象。我已經嘗試了RelativeSource,但我只能通過這種方式獲得父窗口的句柄,我無法獲得父窗口中包含的用戶控件的句柄。

我該怎麼做?

回答

0

好多種方法可以解決這個問題:

  1. 已在UserControlbool型的說,自定義Dependency Property。在Button上點擊UserControl,將此bool DP設置爲true。在父級Window中,使用`Trigger來檢查此DP,並且True使用BeginStoryboard操作來啓動Storyboard

  2. 重複上述過程,但使用Tag屬性而不是自定義DP。 (儘量避免這種方法,只要不是太漂亮)

  3. UserControl創建一個自定義RoutedEvent與火從Button.Click事件。讓父窗口訂閱此事件並調用故事板。

  4. 如果您使用的東西像Messenger/EventAggregator類,只需發送一個信息傳達給家長查看從Button.Click和接收該消息時從父視圖調用的腳本中。

  5. 創建父視圖的ICommand屬性,讓你的Button在通過RelativeSourceUserControl綁定到這個命令綁定或者如果它是DataContext是父窗口,你甚至不會需要一個RelativeSource訪問命令。在命令的OnExecute(...)中啓動故事板。

摘要:

我打賭有我想不出快速不少更多的選擇,關鍵是當你Button.Click時告知家長在選擇的方式需要改變它的孩子的狀態,但是它選擇這樣做,並賦予父視圖操作該請求的責任。

孩子停止在請求狀態改變的地步,父視圖是實際做到這一點的人。這樣可以節省您對控制問題的所有訪問權限,並且還有助於遵守「有一件事只擔心那件事和那件事」的原則(這裏的「事情」是每個視圖的類)