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