我正在使用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
属性绑定到MyUserControl
的{{1}}
属性Visibility
命令的目的是设置值
RelayCommand RaiseMyControl
属性MyControlVisible
(默认为false)。 单击窗口中的按钮会导致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
属性绑定到string MyUserControlText
的{{1}}
属性TextBlock
属性绑定到边框的数据模板,用于制作
边界淡入或淡出Text
命令执行两项操作:1。设置bool Fading
属于RelayCommand CloseMyControl
以使边框淡出的属性,以及2.它设置Fading
用户控件的属性为false
。 问题在于:Visibility
设置为Collapsed
后,用户控件就会消失。我需要先淡出然后再消失。我怎样才能实现呢?谢谢。
答案 0 :(得分: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
按名称参考。
要为UserControl设置动画,您可以尝试:
Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"
或
Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=my:MyUserControl}}"
如果逻辑树完好无损,两者都应该有效。
答案 1 :(得分:0)
我尝试将可见性设置为淡出动画的一部分,而不是CloseMyControl命令中的单独行。