C# 在WPF事件触发器上设置防护。这可能吗?
我现在有C# 在WPF事件触发器上设置防护。这可能吗?,c#,wpf,eventtrigger,C#,Wpf,Eventtrigger,我现在有 <ContentControl Grid.Column="2" Grid.Row="3" > <ContentControl.Triggers> <EventTrigger RoutedEvent="UIElement.MouseEnter"> <BeginStoryboard Storyboard="{StaticResource ShakeStatorM
<ContentControl
Grid.Column="2" Grid.Row="3"
>
<ContentControl.Triggers>
<EventTrigger RoutedEvent="UIElement.MouseEnter">
<BeginStoryboard
Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/>
</EventTrigger>
</ContentControl.Triggers>
... <snip> ...
</ContentControl>
在现实世界中,我不知道如何做到这一点 您可以尝试从EventTrigger更改为MultiTrigger,并使用IsMouseOver属性而不是MouseEnter事件。但是,正如您所发现的,样式中的故事板不允许您指定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>
转子
定子
肺叶
大半径
小半径
EnterAction super:)这并不是对事件进行防范的答案,但可以解决我的具体问题。事实上,这对一个微妙的问题不起作用。因为我想触发情节提要,而情节提要需要使用storyboard.TargetName=“StatorMinorRadiusEdit
若要引用右侧控件,我会收到一个XAML错误,表示我无法在样式中使用TargetName
。当你通过谷歌研究这个问题时,一些帖子说使用EventTriggers代替,然后我们又回到了原来的问题。希望你不介意。我用完全充实的XAML更新了您的答案,以说明问题。@BradGonesSurfing您应该将相关代码添加到问题中,而不是添加到Mark的答案中。您应该让Mark根据需要编辑其代码,以修复可能存在的任何问题。由于您的编辑,这篇文章变得更像是一篇评论而不是一个答案。他的答案是错误的,并导致编译时/运行时错误。。不幸的是,马克·格林的答案不起作用,尽管这是一次非常好的尝试。也许对更高层次的人来说这不是一个好主意。我希望我编辑的答案能让你更接近。是的。我敢肯定它解决了我发现的问题。XAML真的是一头猪。例如,不可能将故事板定义为静态资源,然后通过TargetName以任何合理的方式将其应用于远程元素。在这种情况下,MVVM实际上是您的朋友。将IsMouseOver绑定到ViewModel属性,并将DataTrigger绑定到ViewModel属性IsMouseOverAndRotorIsOne以触发情节提要,此问题变得更简单,因为您可以使用可应用于远程元素的样式引用情节提要。
<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>
<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>