WPF动画窗口可见性更改

时间:2010-12-21 16:50:36

标签: wpf animation visibility

我正在尝试弄清楚如何为WPF窗口设置从Visibile到Hidden的更改动画。我目前使应用程序工作的方式是窗口通常是隐藏的,当我将鼠标移动到屏幕的一侧时,它弹出,我使用布尔到可见性转换器来做那个,但我想做什么是让应用程序在鼠标悬停时更顺畅地滑出,然后再重新滑入。

我对动画没有任何影响所以我不知道该怎么做。首先,我不确定我应该使用什么动画来做这个,其次我不确定我是否应该在viewmodel中的“IsWindowVisibile”属性上触发它,或者我是否应该将它绑定到VisibilityChanged事件,第三,我当窗口大小可变时,我不确定这是否可行。

[编辑]

如果有必要,我会'采取'不透明度解决方案,但这并不是我想要的“滑动”效果。

2 个答案:

答案 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很慢,所以如果你需要滑动动画:

  1. 制作透明窗口(AllowsTransparency="True" Background="Transparent" WindowStyle="None"

  2. 将所有控件放在不透明面板(Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}"

  3. 将此面板的Margin.Left0设置为窗口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类)以将这些按钮放在那里。