保护WPF事件触发器.这可能吗?

bra*_*ing 8 c# wpf eventtrigger

我现在有

<ContentControl
   Grid.Column="2" Grid.Row="3" 
   >
   <ContentControl.Triggers>
       <EventTrigger RoutedEvent="UIElement.MouseEnter">
           <BeginStoryboard 
               Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/>
       </EventTrigger>
   </ContentControl.Triggers>

   ... <snip> ...

</ContentControl>
Run Code Online (Sandbox Code Playgroud)

    <Grid.Resources>
         <Storyboard x:Key="ShakeStatorMinorRadiusEdit">
            <DoubleAnimationUsingKeyFrames
                        Storyboard.TargetName="StatorMinorRadiusEdit"
                        Storyboard.TargetProperty="RenderTransform.X" 
                        RepeatBehavior="5x"
                        >
                <EasingDoubleKeyFrame KeyTime="0:0:0.05" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="3"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.20" Value="-3"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
     </Grid.Resources>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这个想法是当鼠标进入左侧黄色突出显示的控件时,右侧的黄色突出显示控件将会抖动.右边的控件有x:Name = StatorMinorRadiusEdit到目前为止上面这么好了.

现在我想添加另一个复杂功能.我只希望动画在我的视图模型RotorLobes == 1上的值时触发.在虚构的世界中,我会这样做.

<ContentControl
   Grid.Column="2" Grid.Row="3" 
   >
   <ContentControl.Triggers>
       <EventTrigger RoutedEvent="UIElement.MouseEnter">

           <If Property="{Binding RotorLobes}" Value="1"/>

           <BeginStoryboard 
               Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/>
       </EventTrigger>
   </ContentControl.Triggers>

   ... <snip> ...

</ContentControl>
Run Code Online (Sandbox Code Playgroud)

在现实世界中,我不知道如何实现这一目标.

Mar*_*een 4

您可以尝试从 EventTrigger 更改为 MultiTrigger 并使用 IsMouseOver 属性而不是 MouseEnter 事件。但是,正如您所发现的,样式中的 Storyboard 不允许您指定 TargetName,因此将触发器移动到目标对象非常重要。

下面的示例将 Rotor 的值硬编码为 1,您需要在 TargetProperty 中正确命名 RenderTransform,否则您将收到运行时异常。

<Grid>
        <Grid.Resources>
            <Storyboard x:Key="ShakeStatorMinorRadiusEdit">
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)"
                                               RepeatBehavior="5x">
                    <EasingDoubleKeyFrame KeyTime="0:0:0.05"
                                          Value="0" />
                    <EasingDoubleKeyFrame KeyTime="0:0:0.1"
                                          Value="3" />
                    <EasingDoubleKeyFrame KeyTime="0:0:0.15"
                                          Value="0" />
                    <EasingDoubleKeyFrame KeyTime="0:0:0.20"
                                          Value="-3" />
                    <EasingDoubleKeyFrame KeyTime="0:0:0.25"
                                          Value="0" />
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </Grid.Resources>

        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="1">Rotor</TextBlock>
        <TextBlock Grid.Column="2">Stator</TextBlock>

        <TextBlock Grid.Column="0"
                   Grid.Row="1">Lobes</TextBlock>
        <TextBlock Grid.Column="0"
                   Grid.Row="2">Major Radius</TextBlock>
        <TextBlock Grid.Column="0"
                   Grid.Row="3">Minor Radius</TextBlock>

        <TextBox Name="RotorLobes"
                 Grid.Column="1"
                 Grid.Row="1"
                 Text="1" />
        <TextBox Grid.Column="1"
                 Grid.Row="2" />
        <TextBox Name="MinorRadiusRotor"
                 Background="Blue"
                 Grid.Column="1"
                 Grid.Row="3" />

        <TextBox Grid.Column="2"
                 Grid.Row="1" />
        <TextBox Grid.Column="2"
                 Grid.Row="2" />
        <TextBox Name="MinorRadiusStator"
                 Background="Green"
                 Grid.Column="2"
                 Grid.Row="3">
            <TextBox.Style>
                <Style>
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=MinorRadiusRotor, Path=IsMouseOver}"
                                           Value="True" />
                                <Condition Binding="{Binding ElementName=RotorLobes, Path=Text}}"
                                           Value="1" />
                            </MultiDataTrigger.Conditions>
                            <MultiDataTrigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}" />
                            </MultiDataTrigger.EnterActions>
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>

    </Grid>
Run Code Online (Sandbox Code Playgroud)