标签内容更改时触发触发器

时间:2018-06-30 17:55:06

标签: c# wpf animation

我刚刚开始学习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">

2 个答案:

答案 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>

希望它能对您有所帮助。