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)
在现实世界中,我不知道如何实现这一目标.
您可以尝试从 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)
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |