2011-04-16 136 views
5

我正在使用MVVM Light。我已經創建了一個看起來像這樣的窗口:動畫完成後的運行代碼

<Window Name="MainWindow" ...> 
    <Window.Resources> 
    ... 
    <viewModels:MainViewModel x:Key="mainVM" /> 
    ... 
    <BooleanToVisibilityConverter x:Key="visConv" /> 
    ... 
    </Window.Resources> 

    <Grid DataContext="{StaticResource mainVM}> 
    ... 
    <Button Command="{Binding RaiseMyControl}" /> 
    ... 
    <my:MyUserControl Visibility="{Binding MyControlVisible, 
     Converter={StaticResource visConv}}" /> 
    </Grid> 

</Window> 

所以基本上,MainViewModel是窗口視圖模型類。它包含:其被綁定到

  • bool MyControlVisible屬性MyUserControlVisibility 屬性
  • RelayCommand RaiseMyControl命令其目的是將 MyControlVisible屬性的值設定爲true(默認爲假)。

單擊窗口中的按鈕會導致出現MyUserControl - 簡單。

MyUserControl用戶控制是這樣的:

<UserControl ...> 
    <UserControl.Resources> 
    ... 
    <viewModels:MyUserControlViewModel x:Key="userControlVM" /> 
    ... 
    </UserControl.Resources> 

    <Grid DataContext="{StaticResource userControlVM}> 
    ... 
    <Border Width="200" Height="100" Background="Red"> 
     <TextBlock Text="{Binding MyUserControlText}" /> 
    </Border> 
    <!-- This border has a DataTrigger bound to "bool Fading" property of 
     the view model. When Fading is true, the border fades in through 
     an animation. When it is false, the border fades out. --> 
    ... 
    <Button Command="{Binding CloseMyControl}" /> 
    </Grid> 

</UserControl> 

再次,很簡單。 MyUserControlViewModel是用戶控件的視圖模型類。它包含:其綁定到TextBlockText 財產

  • bool Fading財產被綁定到邊境的數據模板

    • string MyUserControlText屬性,是用來做 邊境淡入或淡出
    • RelayCommand CloseMyControl命令有兩個作用:1.它將Fading 屬性設置爲false以使邊框淡出,2.將用戶控件的Visibility 屬性設置爲Collapsed

    以下是問題:只要Visibility設置爲Collapsed,用戶控件就會消失。我需要它先消失然後消失。我怎樣才能做到這一點?謝謝。

  • 回答

    3

    由於可見性屬於淡出狀態,因此我會同時運行兩個動畫。除了淡入淡出動畫(無論是哪種類型或組合),您都可以創建一個ObjectAnimationUsingKeyFrames,它在淡入淡出結束的關鍵時刻設置Visibiliy。

    XAML例如:

    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"> 
        <DiscreteObjectKeyFrame KeyTime="0:0:0.5"> 
         <DiscreteObjectKeyFrame.Value> 
          <Visibility>Collapsed</Visibility> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrame> 
    </ObjectAnimationUsingKeyFrames> 
    

    此外,所有的故事板和動畫有Completed事件,你可以訂閱,只是設置的值的時候了。


    如要直接在另一個控制使用Storyboard.Target動畫複雜的引用,或Storyboard.TargetName按名稱引用。

    設置動畫的用戶控件,你可以嘗試:

    Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}" 
    

    Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=my:MyUserControl}}" 
    

    如果邏輯樹是否完好雙方應該工作。

    +0

    @ H.B。再一次問好! :)由於動畫是在邊框上設置的,我需要'Visibility'來定位我的用戶控件,所以我如何從這個動畫中引用它? – Boris 2011-04-16 03:01:57

    +0

    增加了一些關於這個答案的信息,看看它是否成功。 – 2011-04-16 03:06:57

    +0

    我添加了ObjectAnimationUsingKeyFrames,但它不會摺疊'Visibility'屬性。它仍然是「可見」。我知道這是因爲我已經暫時將根佈局網格的背景顏色設置爲黃色。因此,邊界淡出,但控制仍然可見,即黃色。有什麼想法嗎? – Boris 2011-04-16 03:31:02

    0

    我想嘗試將可見性設置爲淡出動畫的一部分,而不是CloseMyControl命令中的單獨行。