MultiTriggers, использующие то же свойство в XAML - PullRequest
0 голосов
/ 29 ноября 2018

Я на самом деле переопределяю 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 Pai спросил, вот полный 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, он работает, но мне действительно нужно выделить случай, когда я теряю фокус с пустым текстом и без него.Любое предложение о том, как этого добиться?

...