MultiTriggers, использующие то же свойство в XAML

Я на самом деле переопределяю дефолт ControlTemplate из TextBox и чтобы сделать то, что я хочу, мне нужно вызвать две анимации, когда TextBox потерять фокус, и текст пуст. Для этого я использую MultiTrigger с двумя условиями как это:

(Я буду использовать анимацию на FontSize для примера)

<MultiTrigger>
  <MultiTrigger.Conditions>
    <Condition Property="IsFocused" Value="False"/>
    <Condition Property="Text" Value="{x:Static sys:String.Empty}"/>
  </MultiTrigger.Conditions>
  <MultiTrigger.EnterActions>
    <BeginStoryboard>
      <Storyboard>
        <DoubleAnimation Storyboard.TargetName="Title" Storyboard.TargetProperty="FontSize" From="9" To="120" Duration="0:0:2">
          <DoubleAnimation.EasingFunction>
            <QuinticEase EasingMode="EaseInOut"/>
          </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
      </Storyboard>
    </BeginStoryboard>
  </MultiTrigger.EnterActions>
</MultiTrigger>

Дело в том, что анимация запускается на TextBox экземпляр, потому что TextBox не фокусируется и Text пустой. Таким образом, мы можем сказать, что анимация и MultiTrigger работают, но когда я фокусирую TextBox однажды GotFocus сбрасывает FontSize), на LostFocus анимация больше не срабатывает.

НО если я заменю весь MultiTrigger.EnterActions этим:

<MultiTrigger.Setters>
  <Setter Property="Background" Value="Red"/>
</MultiTrigger.Setters>

Все работает как шарм. Я имею в виду, что фон красный в начале, белый на GotFocus и снова красный на LostFocus,

Я мог бы неправильно понять, как мы должны использовать EnterActions но не так много документации по MultiTriggers там Вы знаете, почему анимация больше не срабатывает после первого раза?

И, кстати, есть ли лучший способ, чем Value="{x:Static sys:String.Empty}"проверить, если Text свойство пусто?

РЕДАКТИРОВАТЬ: В моем ControlTemplate.Triggers я уже использую два EventTriggersодин направляется к GotFocus событие, а другой к LostFocus событие. Я видел на MSDN, что EnterActions не относится к EventTrigger, поэтому я попытался избавиться от обоих моих EventTriggers и теперь это работает.

Дело в том, что я использовал MultiTrigger потому что мне нужно было проверить, Text был пуст на LostFocus но может быть есть способ поставить это условие в EventTrigger?

РЕДАКТИРОВАТЬ № 2: КАК @Satish Пай спросил, вот полный ControlTemplate в котором я заменил EventTriggers по MutliTrigger потому что, как я уже сказал, они кажутся несовместимыми.

<ControlTemplate TargetType="{x:Type TextBox}">
    <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="14"/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <TextBlock x:Name="Title" Text="{TemplateBinding ToolTip}" Margin="8,14,0,0" Grid.Row="0" Grid.RowSpan="2" Foreground="{StaticResource TextBox.Static.Border}"></TextBlock>
            <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" Grid.Row="1"/>
            <Rectangle x:Name="UnfocusedUnderLine" Fill="{StaticResource TextBox.Static.Border}" Height="6" Margin="0,1,0,0" Grid.Row="2"/>
            <Rectangle x:Name="UnderLine" Fill="{StaticResource TextBox.Focus.Border}" Height="6" Margin="0,1,0,0" Grid.Row="2" Width="0"/>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Opacity" TargetName="border" Value="0.56"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border}"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocused" Value="true">
            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border}"/>
        </Trigger>
        <MultiTrigger x:Name="FocusChanged">
            <MultiTrigger.Conditions>
                <Condition Property="IsFocused" Value="True"/>
            </MultiTrigger.Conditions>
            <MultiTrigger.EnterActions> <!--GotFocus-->
                <BeginStoryboard>
                    <Storyboard>
                        <!--Change UnderLine Color-->
                        <DoubleAnimation Storyboard.TargetName="UnderLine" Storyboard.TargetProperty="Width" From="0" To="500" Duration="0:0:0.25">
                            <DoubleAnimation.EasingFunction>
                                <QuinticEase EasingMode="EaseInOut"/>
                            </DoubleAnimation.EasingFunction>
                        </DoubleAnimation>


                    <!--Move Title Up-->
                    <ThicknessAnimation From="8,14,0,0" To="0,0,0,0" Duration="0:0:0.25" Storyboard.TargetName="Title" Storyboard.TargetProperty="Margin" AutoReverse="False" >
                        <ThicknessAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </ThicknessAnimation.EasingFunction>
                    </ThicknessAnimation>

                    <!--Decrease Title Size-->
                    <DoubleAnimation Storyboard.TargetName="Title"
                                     Storyboard.TargetProperty="FontSize"
                                     From="12"
                                     To="9"
                                     Duration="0:0:0.25">
                        <DoubleAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </DoubleAnimation.EasingFunction>
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
        </MultiTrigger.EnterActions>
        <MultiTrigger.ExitActions>  <!--LostFocus-->
            <BeginStoryboard>
                <Storyboard>

                    <!--Change UnderLine Color-->
                    <DoubleAnimation Storyboard.TargetName="UnderLine"
                                     Storyboard.TargetProperty="Width"
                                     From="500"
                                     To="0"
                                     Duration="0:0:0.2">
                        <DoubleAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </DoubleAnimation.EasingFunction>
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
        </MultiTrigger.ExitActions>
    </MultiTrigger>
    <MultiTrigger x:Name="LostFocusAndEmptyText">
        <MultiTrigger.Conditions>
            <Condition Property="Text" Value="{x:Static sys:String.Empty}"/>
        </MultiTrigger.Conditions>
        <MultiTrigger.EnterActions>
            <BeginStoryboard>
                <Storyboard>
                    <!--Move Title Down-->
                    <ThicknessAnimation From="0,0,0,0" To="8,14,0,0" Duration="0:0:0.2" Storyboard.TargetName="Title" Storyboard.TargetProperty="Margin" AutoReverse="False" >
                        <ThicknessAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </ThicknessAnimation.EasingFunction>
                    </ThicknessAnimation>

                    <!--Increase Title Size-->
                    <DoubleAnimation Storyboard.TargetName="Title"
                                     Storyboard.TargetProperty="FontSize"
                                     From="9"
                                     To="12"
                                     Duration="0:0:0.2">
                        <DoubleAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </DoubleAnimation.EasingFunction>
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
        </MultiTrigger.EnterActions>
    </MultiTrigger>
    <!--LostFocusWithEmptyText-->
</ControlTemplate.Triggers>
</ControlTemplate>

Дело в том, что оба MultiTiggers ссылаются на то же самое IsFocused собственности, и они не хотят работать вместе. Если я удалю LostFocusAndEmptyText триггер это работает, но мне действительно нужно дифференцировать случай, когда я теряю фокус с пустым текстом и без. Любое предложение о том, как этого добиться?

1 ответ

Измените состояние инициализации TiTle TextBlock. Marging="0,0,0,0" FontSize = "9"

      <TextBlock x:Name="Title" Text="{TemplateBinding ToolTip}" FontSize="9" Margin="0,0,0,0" Grid.Row="0" Grid.RowSpan="2" 

используйте свойство анимации «FillBehavior», установленное на «Стоп». и удалите свойство анимации «От» в EventTrigger. удачи!

      <ControlTemplate.Triggers>
    <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Opacity" TargetName="border" Value="0.56"/>
    </Trigger>
    <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border}"/>
    </Trigger>
    <Trigger Property="IsKeyboardFocused" Value="true">
        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border}"/>
    </Trigger>
    <EventTrigger RoutedEvent="GotFocus">
        <BeginStoryboard>
            <Storyboard>
                <ThicknessAnimation To="0,0,0,0" Duration="0:0:0.25"
                                        Storyboard.TargetName="Title" FillBehavior="Stop" 
                                        Storyboard.TargetProperty="Margin" AutoReverse="False" >
                    <ThicknessAnimation.EasingFunction>
                        <QuinticEase EasingMode="EaseInOut"/>
                    </ThicknessAnimation.EasingFunction>
                </ThicknessAnimation>

                <DoubleAnimation Storyboard.TargetName="Title"
                                Storyboard.TargetProperty="FontSize" FillBehavior="Stop" 
                                To="9"
                                Duration="0:0:0.25">
                    <DoubleAnimation.EasingFunction>
                        <QuinticEase EasingMode="EaseInOut"/>
                    </DoubleAnimation.EasingFunction>
                </DoubleAnimation>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
    <MultiTrigger x:Name="LostFocusAndEmptyText">
        <MultiTrigger.Conditions>
            <Condition Property="Text" Value="{x:Static sys:String.Empty}"/>
            <Condition Property="IsFocused" Value="False"/>
        </MultiTrigger.Conditions>
        <Setter TargetName="Title"  Property="FontSize"  Value="12"/>
        <Setter TargetName="Title"  Property="Margin"  Value="8,14,0,0"/>
        <MultiTrigger.EnterActions>
            <BeginStoryboard>
                <Storyboard>
                    <ThicknessAnimation From="0,0,0,0" To="8,14,0,0" Duration="0:0:0.25" 
                                        FillBehavior="Stop"
                                        Storyboard.TargetName="Title" Storyboard.TargetProperty="Margin" 
                                        AutoReverse="False" >
                        <ThicknessAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </ThicknessAnimation.EasingFunction>
                    </ThicknessAnimation>
                    <DoubleAnimation Storyboard.TargetName="Title"
                                Storyboard.TargetProperty="FontSize"
                                FillBehavior="Stop"
                                To="12" From="9"
                                Duration="0:0:0.2">
                        <DoubleAnimation.EasingFunction>
                            <QuinticEase EasingMode="EaseInOut"/>
                        </DoubleAnimation.EasingFunction>
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
        </MultiTrigger.EnterActions>
    </MultiTrigger>                        
</ControlTemplate.Triggers>
Другие вопросы по тегам