我刚刚开始学习WPF,现在我正在使用C#和.NET Framework 4.7编写第二个WPF应用程序。
我想在Label的Content更改时触发动画。我的“视图”上有81个标签,我想将相同的动画与所有标签相关联。
这是我的标签之一,但是它们几乎都是相同的:
<Label x:Name="c00" Content="{Binding BestIndividual[0]}" Margin="0" BorderThickness="2,2,0,0" BorderBrush="Black" />
通过搜索,我找到了solution,但是我不知道如何将其应用于所需的内容。
我想我已经在本文中找到了解决方法:How to: Trigger an Animation When a Property Value Changes。
但是,当Label的内容更改时,谁可以触发触发器?
我发现有关如何触发触发器的唯一方法是当属性具有值时:
<Trigger Property="IsMouseOver" Value="True">
答案 0 :(得分:0)
Label
类没有“ ContentChanged”事件,但是您可以定义自己的自定义Label
类并覆盖OnContentChanged
方法:
public class CustomLabel : Label
{
public event EventHandler ContentChanged;
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
if (ContentChanged != null)
ContentChanged(this, EventArgs.Empty);
}
}
在XAML中,您将所有Label
元素替换为自定义类型:
<local:CustomLabel x:Name="c00" Content="{Binding BestIndividual[0]}" ContentChanged="OnContentChanged" />
然后您可以在事件处理程序中以编程方式执行动画。
答案 1 :(得分:0)
EventTrigger用于执行动作-包括动画-响应routed event。
根据mm8的建议,Label
控件没有“ ContentChanged ”事件。但是,您可以使用路由事件来代替使用普通事件:
public class CustomLabel : Label
{
public static readonly RoutedEvent ContentChangedEvent = EventManager.RegisterRoutedEvent(
"ContentChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CustomLabel));
public event RoutedEventHandler ContentChanged
{
add
{
AddHandler(ContentChangedEvent, value);
}
remove
{
RemoveHandler(ContentChangedEvent, value);
}
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
RaiseEvent(new RoutedEventArgs(ContentChangedEvent));
}
}
通过这种方式,您可以创建带有Style
的{{1}}来开始动画:
EventTrigger
然后,您需要将该样式应用于(自定义)标签:
<Style x:Key="ContentChangedAnimated" TargetType="{x:Type local:CustomLabel}"
BasedOn="{StaticResource {x:Type Label}}">
<Style.Triggers>
<EventTrigger RoutedEvent="ContentChanged">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="FontSize"
To="28" AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
希望它能对您有所帮助。