Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF事件触发器上设置防护。这可能吗?_C#_Wpf_Eventtrigger - Fatal编程技术网

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>