我正在尝试弄清楚如何为WPF窗口设置从Visibile到Hidden的更改动画。我目前使应用程序工作的方式是窗口通常是隐藏的,当我将鼠标移动到屏幕的一侧时,它弹出,我使用布尔到可见性转换器来做那个,但我想做什么是让应用程序在鼠标悬停时更顺畅地滑出,然后再重新滑入。
我对动画没有任何影响所以我不知道该怎么做。首先,我不确定我应该使用什么动画来做这个,其次我不确定我是否应该在viewmodel中的“IsWindowVisibile”属性上触发它,或者我是否应该将它绑定到VisibilityChanged事件,第三,我当窗口大小可变时,我不确定这是否可行。
[编辑]
如果有必要,我会'采取'不透明度解决方案,但这并不是我想要的“滑动”效果。
答案 0 :(得分:12)
我做了类似的事情(不透明度在2秒内变为0,窗口隐藏):只看代码,很简单
MainWindow.xaml:
<Storyboard x:Key="hideMe">
<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:2" To="0.0"/>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:2" Value="{x:Static Visibility.Hidden}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="showMe">
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:5" To="0.75"/>
</Storyboard>
MainWindow.xaml.cs
public void ShowMe() {
(FindResource("showMe") as Storyboard).Begin(this);
}
public void HideMe() {
(FindResource("hideMe") as Storyboard).Begin(this);
}
只需致电HideMe()
或ShowMe()
,而不是在代码中设置Visibility = Visibility.Hidden
修改强>
移动窗户时WPF很慢,所以如果你需要滑动动画:
制作透明窗口(AllowsTransparency="True" Background="Transparent" WindowStyle="None"
)
将所有控件放在不透明面板(Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}"
)
将此面板的Margin.Left
从0
设置为窗口ActualWidth
,然后隐藏一个窗口 - 这将消除保存窗口大小的问题
答案 1 :(得分:2)
使用窗口Opacity
/ Visibility
进行操作需要简单的DoubleAnimation
。
IsVisibleChanged += new DependencyPropertyChangedEventHandler(MainWindow_IsVisibleChanged);
void MainWindow_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
DoubleAnimation da = new DoubleAnimation()
{
From = (IsVisible) ? 0 : 1,
To = (IsVisible) ? 1 : 0,
Duration = TimeSpan.FromSeconds(1)
};
BeginAnimation(Window.OpacityProperty, da);
}
为了使其按预期工作,您需要在窗口上将AllowsTransparency
设置为True
。如果您未设置此设置,则Opacity
设置为0
的窗口将为Black
。
问题是此属性为True
,您需要将WindowStyle
设为None
。这意味着你的窗户周围没有框架。这意味着没有关闭,最小化,最大化,恢复,标题栏。
您必须提供自定义模板(可能会继承Window
类)以将这些按钮放在那里。