窗口淡入导致在淡入之前快速白色闪烁窗口内容

时间:2012-02-08 23:10:28

标签: wpf animation

我希望WPF窗口在打开时淡入。我为窗口加载设置了以下触发器:

<Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <BeginStoryboard>
            <Storyboard Name="FormFade">
                <DoubleAnimation  Name="FormFadeAnimation"
                                        Storyboard.TargetName="Window"
                                        Storyboard.TargetProperty="(Window.Opacity)"
                                        From="0.0" To="1.0" Duration="0:0:5"
                                        AutoReverse="False" RepeatBehavior="1x"
                                     />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>

问题在于,当窗口首次加载时,它会显示内容的所有白色,然后消失,然后窗口内容按预期淡入。我怎样才能摆脱刚开始时发生的白色闪光?我甚至将窗口的背景设置为黑色但仍然闪烁白色。

2 个答案:

答案 0 :(得分:2)

我认为问题是由Window.Loaded处理程序中的处理引起的。在Window.Loaded处理程序完成执行之前,动画将不会运行。我能够通过这样做来重现你的问题:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Thread.Sleep(1000);
        }
    }
}

屏幕将为白色1000毫秒,因为动画在睡眠结束前不会运行。如果你拿走Thread.Sleep()调用,结果就是你所期望的。我的猜测是你在Loaded处理程序中做了很多工作,动画正在被延迟。

顺便说一句,这里是MainWindow.xaml,与你拥有的几乎相同:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" x:Name="Window">
    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard>
                <Storyboard Name="FormFade">
                    <DoubleAnimation  Name="FormFadeAnimation"
                                        Storyboard.TargetName="Window"
                                        Storyboard.TargetProperty="(Window.Opacity)"
                                        From="0.0" To="1.0" Duration="0:0:5"
                                        AutoReverse="False" RepeatBehavior="1x"
                                     />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
    <Grid>
        <TextBlock>asdf</TextBlock>
    </Grid>
</Window>

答案 1 :(得分:0)

尝试在Window.Opacity标记中将<Window>设置为0开始。

编辑:@ H.B是绝对正确的。窗口也需要AllowsTransparency=true,为此,窗口镶边需要关闭(WindowStyle=None)。我重现了你的问题,然后按照你想要的方式做到了这一点:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
        Opacity="0" AllowsTransparency="True" WindowStyle="None">
    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard>
                <Storyboard Name="FormFade">
                    <DoubleAnimation  Name="FormFadeAnimation"
                                        Storyboard.TargetProperty="(Window.Opacity)"
                                        From="0.0" To="1.0" Duration="0:0:5"
                                        AutoReverse="False" RepeatBehavior="1x"
                                     />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
    <Grid>

    </Grid>
</Window>