Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WPF C同时设置两个UIC元素的动画#_C#_Wpf_Animation_Asynchronous_Storyboard - Fatal编程技术网

C# 使用WPF C同时设置两个UIC元素的动画#

C# 使用WPF C同时设置两个UIC元素的动画#,c#,wpf,animation,asynchronous,storyboard,C#,Wpf,Animation,Asynchronous,Storyboard,我这里有两个动画,一个用于关闭滑出网格导航菜单,另一个用于在菜单关闭时将矩形填充设置为透明 我希望这两者同时发生。现在,动画按调用顺序进行 如何使用C#代码尽可能简单、干净地实现这一点?我创建这个应用程序只是为了了解动画和布局控件的不同方式 private void _CloseSlideGrid() { DoubleAnimation da = new DoubleAnimation(); da.Duration = TimeSpan.FromSeconds(0.3d);

我这里有两个动画,一个用于关闭滑出网格导航菜单,另一个用于在菜单关闭时将矩形填充设置为透明

我希望这两者同时发生。现在,动画按调用顺序进行

如何使用C#代码尽可能简单、干净地实现这一点?我创建这个应用程序只是为了了解动画和布局控件的不同方式

private void _CloseSlideGrid()
{
    DoubleAnimation da = new DoubleAnimation();
    da.Duration = TimeSpan.FromSeconds(0.3d);
    da.DecelerationRatio = 1.0d;
    da.From = 500.0d;
    da.To = 0.0d;
    _slideGrid.BeginAnimation(Grid.WidthProperty, da);
}

private void _DisableTransparentCover()
{
    BrushAnimation ba = new BrushAnimation();
    ba.Duration = TimeSpan.FromSeconds(0.3d);
    ba.DecelerationRatio = 1.0d;
    ba.From = _GetBrush("#77000000");
    ba.To = _GetBrush("#00000000");
    _tranparentCover.BeginAnimation(Rectangle.FillProperty, ba);
}
关闭按钮的事件回调调用两个私有函数来处理动画

private void _NavCloseButton_Click(object sender, RoutedEventArgs e)
{
    _CloseSlideGrid();
    _DisableTransparentCover();
}
如果您感兴趣,这里有一个Imgur相册的链接,其中包含我的窗口的两种状态的屏幕截图:

如果我能提供更多信息,请告诉我


谢谢。

只要把它们添加到同一个故事板上就可以了。我不确定你的笔刷动画是什么,但使用ColorAnimation和属性路径,如下所示,效果很好

<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"
        SizeToContent="WidthAndHeight">
    <Window.Resources>
        <Storyboard x:Key="CloseAnimation">
            <DoubleAnimation From="500.0" To="0.0" DecelerationRatio="1.0" Duration="00:00:03"
                             Storyboard.TargetName="MyTextBox" Storyboard.TargetProperty="Width"/>
            <ColorAnimation From="#77000000" To="#00000000" DecelerationRatio="1.0" Duration="00:00:03"
                            Storyboard.TargetName="MyGrid" Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"/>
        </Storyboard>
    </Window.Resources>

    <StackPanel>

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <TextBox x:Name="MyTextBox" Grid.Column="0" Width="500"/>

            <Grid x:Name="MyGrid" Grid.Column="1" Background="#77000000" Width="100"/>
        </Grid>

        <Button Content="Animate">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click" >
                    <BeginStoryboard  Storyboard="{StaticResource CloseAnimation}"/>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </StackPanel>
</Window>

我认为您的
BrushAnimation
实现中存在一些问题。我已经测试了两个
doubleanimation
——都很好,动画同时播放。也许可以将它们添加到同一个故事板?正如名称
BeginAnimation
所暗示的,该方法启动动画并立即返回。随后为两个不同的动画调用BeginAnimation会使它们同时运行。故事板不是必需的。BrushAnimation是一个由AnimationTimeline继承的类。我在这里找到的。你知道我必须对画笔动画做些什么才能让它同时工作吗?还有,也许这两个双动画工作的唯一原因是因为它们属于同一类型。我想使用另一个.net动画作为我的第二个动画进行测试,看看它们是否会像两个doubleanimations那样异步运行。知道我将如何在c#而不是XAML中实现这一点吗。我从未使用过XAML,它也不清楚与此标记等价的代码是什么。谢谢谢谢你用c代码编辑你的答案!
private void _CloseSlideGrid(Storyboard sb)
{
    DoubleAnimation da = new DoubleAnimation();
    da.Duration = TimeSpan.FromSeconds(0.3d);
    da.DecelerationRatio = 1.0d;
    da.From = 500.0d;
    da.To = 0.0d;
    Storyboard.SetTarget(da, MyTextBox);
    Storyboard.SetTargetProperty(da, new PropertyPath("Width"));

    sb.Children.Add(da);
}

private void _DisableTransparentCover(Storyboard sb)
{
    ColorAnimation ba = new ColorAnimation();
    ba.Duration = TimeSpan.FromSeconds(0.3d);
    ba.DecelerationRatio = 1.0d;
    ba.From = (Color)ColorConverter.ConvertFromString("#77000000");
    ba.To = (Color)ColorConverter.ConvertFromString("#00000000");

    Storyboard.SetTarget(ba, MyGrid);
    Storyboard.SetTargetProperty(ba, new PropertyPath("(Background).(SolidColorBrush.Color)"));

    sb.Children.Add(ba);
}

private void _NavCloseButton_Click(object sender, RoutedEventArgs e)
{
    var sb = new Storyboard();

    _CloseSlideGrid(sb);
    _DisableTransparentCover(sb);

    sb.Begin();
}