繁体   English   中英

WPF动画不起作用

[英]WPF animation does not work

我创建了一个微调器控件,如下所示,但是在用win.Show()命令打开的窗口中使用时,动画不起作用。

我打开此窗口的代码是:

win = new WaitWindow("wait...");
win.Show();

//do some long processing

win.Close();

好像窗口线程被冻结了。

我可以做什么?

这是微调器控件:

<UserControl.Resources>
<Color x:Key="FilledColor" A="255" B="155" R="155" G="155"/>
<Color x:Key="UnfilledColor" A="0" B="155" R="155" G="155"/>

<Style x:Key="BusyAnimationStyle" TargetType="Control">
    <Setter Property="Background" Value="#7F000000"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Control">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="Animation0" BeginTime="00:00:00.0" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse0" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation1" BeginTime="00:00:00.2" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse1" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation2" BeginTime="00:00:00.4" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse2" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation3" BeginTime="00:00:00.6" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse3" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation4" BeginTime="00:00:00.8" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse4" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation5" BeginTime="00:00:01.0" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse5" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation6" BeginTime="00:00:01.2" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse6" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>

                    <Storyboard x:Key="Animation7" BeginTime="00:00:01.4" RepeatBehavior="Forever">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse7" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/>
                            <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                </ControlTemplate.Resources>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsVisible" Value="True">
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource Animation0}" x:Name="Storyboard0" />
                            <BeginStoryboard Storyboard="{StaticResource Animation1}" x:Name="Storyboard1"/>
                            <BeginStoryboard Storyboard="{StaticResource Animation2}" x:Name="Storyboard2"/>
                            <BeginStoryboard Storyboard="{StaticResource Animation3}" x:Name="Storyboard3"/>
                            <BeginStoryboard Storyboard="{StaticResource Animation4}" x:Name="Storyboard4"/>
                            <BeginStoryboard Storyboard="{StaticResource Animation5}" x:Name="Storyboard5"/>
                            <BeginStoryboard Storyboard="{StaticResource Animation6}" x:Name="Storyboard6"/>
                            <BeginStoryboard Storyboard="{StaticResource Animation7}" x:Name="Storyboard7"/>
                        </Trigger.EnterActions>

                        <Trigger.ExitActions>
                            <StopStoryboard BeginStoryboardName="Storyboard0"/>
                            <StopStoryboard BeginStoryboardName="Storyboard1"/>
                            <StopStoryboard BeginStoryboardName="Storyboard2"/>
                            <StopStoryboard BeginStoryboardName="Storyboard3"/>
                            <StopStoryboard BeginStoryboardName="Storyboard4"/>
                            <StopStoryboard BeginStoryboardName="Storyboard5"/>
                            <StopStoryboard BeginStoryboardName="Storyboard6"/>
                            <StopStoryboard BeginStoryboardName="Storyboard7"/>
                        </Trigger.ExitActions>
                    </Trigger>
                </ControlTemplate.Triggers>

                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                    <Grid>
                    <Canvas Height="60" Width="60">
                        <Canvas.Resources>
                            <Style TargetType="Ellipse">
                                <Setter Property="Width" Value="15"/>
                                <Setter Property="Height" Value="15" />
                                <Setter Property="Fill" Value="#009B9B9B" />
                            </Style>
                        </Canvas.Resources>

                        <Ellipse x:Name="ellipse0" Canvas.Left="1.75" Canvas.Top="21"/>
                        <Ellipse x:Name="ellipse1" Canvas.Top="7" Canvas.Left="6.5"/>
                        <Ellipse x:Name="ellipse2" Canvas.Left="20.5" Canvas.Top="0.75"/>
                        <Ellipse x:Name="ellipse3" Canvas.Left="34.75" Canvas.Top="6.75"/>
                        <Ellipse x:Name="ellipse4" Canvas.Left="40.5" Canvas.Top="20.75" />
                        <Ellipse x:Name="ellipse5" Canvas.Left="34.75" Canvas.Top="34.5"/>
                        <Ellipse x:Name="ellipse6" Canvas.Left="20.75" Canvas.Top="39.75"/>
                        <Ellipse x:Name="ellipse7" Canvas.Top="34.25" Canvas.Left="7" />
                        <Ellipse Width="39.5" Height="39.5" Canvas.Left="8.75" Canvas.Top="8" Visibility="Hidden"/>
                    </Canvas>
                        <Label Content="{Binding Path=Text}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</UserControl.Resources>
<Control Style="{StaticResource BusyAnimationStyle}"/>

更新

我的Windows控件如下所示:注意:使用win.ShowDialog()可以正常工作,但是在打开Windows时剩余的进程无法运行。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <local:Spinner Grid.Column="0" Width="16" Height="16" Margin="8,4,4,4" />
    <TextBlock Grid.Column="1" Name="MessageControl" VerticalAlignment="Center" Margin="8" />
</Grid>

这是因为您在UI线程中执行了较长的操作,请改用另一个线程,这是一个示例:

var win = new WaitWindow();
Task.Factory.StartNew(() =>
{
    try
    {
        //do some long processing
        Thread.Sleep(1000);
    }
    finally
    {
        win.Dispatcher.Invoke(() => { win.Close(); });
    }
});
win.Show();

您可以使用Task.Run启动长时间运行的操作。 但是,您可以仅通过从标记为async的方法中await任务来await任务,而不是从Task操作内的Dispatcher操作关闭Window:

假设有一些事件处理程序开始处理:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var win = new WaitWindow("wait...");
    win.Show();

    await Task.Run(() =>
    {
       // do some long processing
    });

    win.Close();
}

您可以使用Task.RunContinueWith将工作加载到任务中,并在任务结束时关闭窗口(请注意,此处我不检查任务是否成功)。

var win = new WaitWindow("wait...");
win.Show();

Task.Run(() =>
{
    //do some long processing
    ProcessSomething();
}).ContinueWith(t =>
{
    Dispatcher.Invoke(() => win.Close());
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM