为这个微不足道的问题道歉,我是WPF的新手并且不断寻找几乎描述我想要的博客......
我有一个绑定到属性的Label并在屏幕上很好地更新,现在我想要一个小动画,只要值更新,它就会闪烁标签的背景颜色。理想情况下,我想要一个纯xaml解决方案
我查看了DataTriggers,但它们似乎需要保持相等条件,并且EventTriggers似乎无法附加到与数据显示有关的任何事件
感谢 奥斯卡
答案 0 :(得分:7)
你不应该使用事件触发器吗?
您需要在绑定中设置NotifyOnTargetUpdated=True
,但这适用于我的代码。
<DataTemplate>
<Border Name="templateBorder">
<TextBlock Text="{Binding Path=Name, NotifyOnTargetUpdated=True}" />
</Border>
<DataTemplate.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To=".1" Duration="0:0:.5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataTemplate.Triggers>
</DataTemplate>
答案 1 :(得分:2)
请检查以下代码是否适合您。标签的Content属性的任何更改都是动画的。它是使用触发器和值转换器类完成的,它会将内容值转换为“True”或“False”,并设置触发器以对这2个值作出反应。 Cnverter附加到标签的Tag属性,该属性弯曲到数据上下文的Name属性。此外,我还添加了一些动画,鼠标进入和离开事件非常简单,仅使用xaml中的RouterEvents完成。
转换器:
public class TestConverter : IValueConverter
{
private string _originalValue = String.Empty;
private bool _previousValue = false;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
_originalValue = (string)value;
_previousValue = !_previousValue;
return _previousValue.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return _originalValue;
}
}
数据上下文初始化:
label1.DataContext = new Test() { Name = DateTime.Now.ToString() };
XAML:
<Window.Resources>
<local:TestConverter x:Key="TestConverter" />
</Window.Resources>
<Grid>
<Label
Height="28"
HorizontalAlignment="Left"
Margin="132,96,0,0"
Name="label1" VerticalAlignment="Top" Width="120">
<Label.Content>
<Binding Path="Name"/>
</Label.Content>
<Label.Tag>
<Binding Path="Name" Converter="{StaticResource TestConverter}"/>
</Label.Tag>
<Label.Background>
<SolidColorBrush x:Name="animatedBrush1" Color="Yellow" />
</Label.Background>
<Label.Style>
<Style TargetType="Label">
<Style.Triggers>
<Trigger Property="Tag" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard AutoReverse="True">
<!--<DoubleAnimation
Storyboard.TargetProperty="FontSize" To="20"/>-->
<DoubleAnimation
Storyboard.TargetProperty="Opacity" To="0.0" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
<Trigger Property="Tag" Value="False">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation
Storyboard.TargetProperty="FontSize" To="20"/>
<!--"<DoubleAnimation
Storyboard.TargetProperty="Opacity" To="0.0" AutoReverse="True"/>-->
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
</Label.Style>
<Label.Triggers>
<EventTrigger RoutedEvent="Label.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="animatedBrush1"
Storyboard.TargetProperty="Color"
To="Blue" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Label.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="animatedBrush1"
Storyboard.TargetProperty="Color"
To="Yellow" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Label.Triggers>
</Label>
</Grid>
希望这有帮助,尊重
答案 2 :(得分:2)
我喜欢serge_gubenko的回答,但我想应该提一下我有时使用的另一种技巧。 Serge的答案更接近你的“纯XAML”理想,因为它只有一个转换器,但这个答案代码较少,可能更具可读性。这是:
将PropertyChangedCallback添加到“Name”属性并从那里启动故事板:
DependencyProperty NameProperty = DependencyProperty.Register( ..., new UIElementMetadata
{
PropertyChangedCallback = (obj, e) =>
{
storyBoard.Begin();
}
});
如果您在首次加载窗口时不想使用闪光灯,则可以添加标记:
...
PropertyChangedCallback = (obj, e) =>
{
if(_initialized)
storyBoard.Begin();
}
...
protected override void OnInitialized(...)
{
_initialized = true;
}