Проблема с условным триггером (или анимацией) - PullRequest
0 голосов
/ 27 июня 2011

У меня есть этот код:

<UserControl.Resources>
    <Storyboard x:Key="OnMouseEnterToDocumentsMenu">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Documents">
            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.8"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="OnMouseLeaveFromDocumentsMenu">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Documents">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.3"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="OnMouseEnterToPeopleMenu">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="People">
            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.8"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="OnMouseLeaveFromPeopleMenu">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="People">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.3"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    </Storyboard>
</UserControl.Resources>
<UserControl.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="Documents">
        <BeginStoryboard Storyboard="{StaticResource OnMouseEnterToDocumentsMenu}"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="Documents">
        <BeginStoryboard Storyboard="{StaticResource OnMouseLeaveFromDocumentsMenu}"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="People">
        <BeginStoryboard Storyboard="{StaticResource OnMouseEnterToPeopleMenu}"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="People">
        <BeginStoryboard Storyboard="{StaticResource OnMouseLeaveFromPeopleMenu}"/>
    </EventTrigger>
    </EventTrigger>
</UserControl.Triggers>

Назначение

Я анимация меню. Элементами меню являются TextBlocks, я имитирую «Затухание при наведении».

Задача

Код, который я разместил, оживляет прозрачность, когда мышь входит или выходит. У меня есть другой метод (код позади), который устанавливает «1» непрозрачности элемента меню, как только пользователь щелкает его в меню (и загружает соответствующий пользовательский элемент управления в соответствующий контейнер). Я предполагаю, что этот метод работает, НО , как только анимация MouseLeave запускается, он снова теряет прозрачность, независимо от того, был выбран этот элемент или нет (Если его непрозрачность была 1, а не 0,8).

Нуждается

Есть ли способ указать, что триггер MouseLeave срабатывает только тогда, когда Source Opacity не равен 1. Или выполнять раскадровку, только если TargetProperty не равен 1.

Спасибо.

PS

Есть ли способ предотвратить дублирование кода, учитывая, что анимационные раскадровки одинаковы (для фокуса и для затухания) и что появится больше меню. Я продублирую его, потому что мне нужно указать TargetName, но я полагаю, что есть и другой «более чистый» способ.

1 Ответ

0 голосов
/ 28 июня 2011

Такое поведение обусловлено значением свойства зависимости приоритет . Я не нашел xamlish способ сделать это. Но с кодом позади вот как:

  • Подписаться на завершение раскадровки.
  • Найдите элементы меню, которые были выбраны, и вызовите на них BeginAnimation.
  • Вы можете найти больше информации об этом здесь .

    private void Storyboard_Completed(object sender, EventArgs e) 
    { 
        foreach (var menuItem in this.file.Items) 
        { 
            var item = (MenuItem)menuItem; 
            if (item.IsChecked) 
            { 
                item.BeginAnimation(UIElement.OpacityProperty, null); 
                item.Opacity = 1; 
            } 
        } 
    } 
    

    Я искал IsChecked, чтобы сказать, выбран ли пункт меню. Используйте свою собственную методологию, если это вас не устраивает.

Для вопроса 2 добавьте это к ресурсам, и вы сможете избавиться от всех отдельных триггеров и дубликатов раскадровок:

        <Window.Resources> 
    <Storyboard x:Key="HoverOn"> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Opacity)"> 
            <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.8"/> 
        </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Storyboard x:Key="HoverOff" Completed="Storyboard_Completed"> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Opacity)"> 
            <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="0.3"/> 
        </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Style TargetType="{x:Type MenuItem}"> 
        <Style.Triggers> 
        <EventTrigger RoutedEvent="Mouse.MouseEnter" > 
            <BeginStoryboard Storyboard="{StaticResource HoverOn}"/> 
        </EventTrigger> 
        <EventTrigger RoutedEvent="Mouse.MouseLeave"> 
            <BeginStoryboard Storyboard="{StaticResource HoverOff}"/> 
        </EventTrigger> 
        </Style.Triggers> 
    </Style> 
</Window.Resources> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...