Запустите триггер при изменении содержимого метки - PullRequest
0 голосов
/ 30 июня 2018

Я только начал изучать WPF, и сейчас я делаю второе приложение WPF на C # и .NET Framework 4.7.

Я хочу запустить анимацию при изменении содержимого ярлыка. У меня в представлении 81 ярлык, и я хочу связать одну и ту же анимацию со всеми ними.

Это один из моих ярлыков, но все они в основном идентичны:

<Label x:Name="c00" Content="{Binding BestIndividual[0]}" Margin="0" BorderThickness="2,2,0,0" BorderBrush="Black" />

Поиск, я нашел это решение , но я не знаю, как применить к тому, что мне нужно.

Я думаю, я нашел, как это сделать в этой статье: Как: запускать анимацию при изменении значения свойства .

Но кому я могу запустить триггер при изменении Содержания ярлыка?

Единственный способ, которым я нашел способ запуска триггера, - это когда свойство имеет значение:

<Trigger Property="IsMouseOver" Value="True">

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

EventTrigger s предназначены для выполнения действий - включая анимацию - в ответ на перенаправленное событие .

Как и предполагалось мм8 , элемент управления 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 с 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>

Затем вам нужно применить этот стиль к вашим (пользовательским) меткам:

<local:CustomLabel x:Name="c00" Content="{Binding BestIndividual[0]}" Margin="0" Style="{StaticResource ContentChangedAnimated}"
        BorderThickness="2,2,0,0" BorderBrush="Black" />

Надеюсь, это поможет вам.

0 голосов
/ 02 июля 2018

Класс 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" />

Затем можно выполнить анимацию программно в обработчике событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...