设置WPF GridViewCell内容的动画

设置WPF GridViewCell内容的动画,wpf,xaml,animation,gridview,Wpf,Xaml,Animation,Gridview,我有一个WPF ListView,它的View属性设置为GridView。GridView有两列GridViewColumns,每列都有CellTemplate—第一列包含按钮,第二列包含边框。我的目标是在单击第一列中的按钮后,为第二列中的边框设置动画 我尝试了以下XAML: <ListView> <ListView.Items> <ListViewItem /> </ListVie

我有一个WPF ListView,它的View属性设置为GridView。GridView有两列GridViewColumns,每列都有CellTemplate—第一列包含按钮,第二列包含边框。我的目标是在单击第一列中的按钮后,为第二列中的边框设置动画

我尝试了以下XAML:

<ListView>
    <ListView.Items>
        <ListViewItem />                    
    </ListView.Items>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Height="25" 
                                Width="50">
                            <Button.Triggers>
                                <EventTrigger RoutedEvent="ButtonBase.Click">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="MyBorder"
                                                             Storyboard.TargetProperty="Opacity"
                                                             From="1.0"
                                                             To="0.0"                                                                    Duration="0:0:5"
                                                             AutoReverse="True"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Button.Triggers>                                    
                        </Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Second">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Border Background="Black" 
                                Width="50"
                                Height="15"
                                Name="MyBorder"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

但在运行时单击按钮时,会引发InvalidOperationException,并显示以下消息:“在'System.Windows.Controls.button'的名称范围内找不到MyBorder”名称

我做错了什么?正确的方法是什么?
提前感谢。

使用附加属性实现列间动画

使用此方法,还可以访问由于范围限制而无法访问的对象或属性

因此,首先定义一个类来承载附着的属性

namespace CSharpWPF
{
    public class AnimationHelper : DependencyObject
    {
        public static double GetOpacity(DependencyObject obj)
        {
            return (double)obj.GetValue(OpacityProperty);
        }

        public static void SetOpacity(DependencyObject obj, double value)
        {
            obj.SetValue(OpacityProperty, value);
        }

        // Using a DependencyProperty as the backing store for Opacity.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty OpacityProperty =
            DependencyProperty.RegisterAttached("Opacity", typeof(double), typeof(AnimationHelper), new PropertyMetadata(1.0));

    }
}
xaml

我将边框放在参考资料中,并在模板中指定为内容,并使用它制作动画


结果:外观相同,不透明度动画

无法定位MyBorder元素。为了从Button事件触发器访问MyBorder元素,您应该在Button的上下文中定义它。您必须应用另一种方法。为了实现这一目标,functionality@Vikas您的意思是无法使用数据模板在GridViewRow中设置特定单元格的动画?您可以使用附加属性来实现此目的。@MikhailKarpov您可以通过pushpraj提供的答案来实现。谢谢您的回答,pushpraj。这段代码在隐藏边界方面确实起到了作用。但问题是,我可以(实际上)在GridView中有多行,因此,由于两个原因,建议的方法不起作用。因此,您只想隐藏相应的单元格,对吗?谢谢,pushpraj。我对AttachedProperties不太熟悉,所以我找到了解决问题的另一种方法。由于在这个视图后面有一个viewmodel,所以我将按钮的命令绑定到vm的命令。此命令反过来会影响我的vm的布尔属性。将DataTrigger添加到边框的样式并将其绑定到boolean属性,我可以根据属性更改将所需的动画添加到边框。在我的项目中,这个解决方案非常适合,但总的来说,它似乎有点做作。所以我把你的帖子标记为答案,因为在一般情况下,这是一个非常好的解决方案。事实上,你的解决方案非常好。当您可以访问视图模型时,视图模型解决方案非常有效。然而,在模型中具有这样的特性并不是一个理想的解决方案。当没有这样的选项时,附加属性会有所帮助,例如,如果要绑定到xml、数据表等,请随时询问。快乐编码:)
<ListView xmlns:l="clr-namespace:CSharpWPF">
    <ListView.Items>
        <ListViewItem />
        <ListViewItem />
    </ListView.Items>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Height="25"
                            Width="50">
                            <Button.Triggers>
                                <EventTrigger RoutedEvent="ButtonBase.Click">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.Target="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=ListViewItem}}"
                                                         Storyboard.TargetProperty="(l:AnimationHelper.Opacity)"
                                                         From="1.0"
                                                         To="0.0"
                                                         Duration="0:0:5"
                                                         AutoReverse="True" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Button.Triggers>
                        </Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Second">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Border Background="Black"
                                Width="50"
                                Height="15"
                                Name="MyBorder" 
                                Opacity="{Binding (l:AnimationHelper.Opacity),RelativeSource={RelativeSource FindAncestor,AncestorType=ListViewItem}}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>
<ListView>
    <ListView.Items>
        <ListViewItem />
    </ListView.Items>
    <ListView.Resources>
        <Border Background="Black"
                x:Key="MyBorder"
                Width="50"
                Height="15"
                Name="MyBorder" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Height="25"
                                Width="50">
                            <Button.Triggers>
                                <EventTrigger RoutedEvent="ButtonBase.Click">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.Target="{StaticResource MyBorder}"
                                                             Storyboard.TargetProperty="Opacity"
                                                             From="1.0"
                                                             To="0.0"
                                                             Duration="0:0:5"
                                                             AutoReverse="True" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Button.Triggers>
                        </Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Second" x:Name="grid">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ContentControl Content="{StaticResource MyBorder}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>