【问题标题】:How to use condition in EventTrigger in WPF如何在 WPF 的 EventTrigger 中使用条件
【发布时间】:2015-04-21 21:44:31
【问题描述】:

我有两个问题。

Q1:如何在EventTrigger 中使用条件?

在下面的代码中,您可以看到两个EventTriggers 对应于ListBoxItem。如您所见,此EventTriggers 用于MouseEnterMouseLeave 事件。

 <UserControl.Resources>
    <DataTemplate x:Key="DataTemplateItemDirect">
            ...
            ...
            ...
         <DataTemplate.Triggers>
            <EventTrigger SourceName="borderItem" RoutedEvent="Border.MouseLeave">
                <BeginStoryboard>
                    <Storyboard>
                        <ParallelTimeline>
                            <ThicknessAnimationUsingKeyFrames Storyboard.TargetName="TitlePanel" Storyboard.TargetProperty="Margin" BeginTime="00:00:00">
                                <SplineThicknessKeyFrame KeyTime="00:00:00" Value="0,0,0,0" />
                                <SplineThicknessKeyFrame KeyTime="00:00:0.1" Value="0,40,0,0" />
                            </ThicknessAnimationUsingKeyFrames>
                        </ParallelTimeline>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger SourceName="borderItem" RoutedEvent="Border.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <ParallelTimeline>
                            <ThicknessAnimationUsingKeyFrames Storyboard.TargetName="TitlePanel" Storyboard.TargetProperty="Margin" BeginTime="00:00:00">
                                <SplineThicknessKeyFrame KeyTime="00:00:00" Value="0,40,0,0" />
                                <SplineThicknessKeyFrame KeyTime="00:00:0.1" Value="0,0,0,0" />
                            </ThicknessAnimationUsingKeyFrames>
                        </ParallelTimeline>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</UserControl.Resources>

Q2:在服务器端代码(C#代码)中,我定义了一个public static bool变量,我的条件是当变量等于TrueEventTrigger时做他们的工作。我的目标是让用户可以选择在EventTriggers 中启用或禁用动画。

那我该怎么做呢?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    Q1:条件不能在 XAML 中使用,但在您的代码中。

    Q2:为什么你的bool变量被声明为static

    如果您想为用户提供禁用或启用某些功能的可能性,您可以使用复选框并将其绑定到您的 bool 变量。

    【讨论】:

      【解决方案2】:

      在 WPF 中,XAML 中的 EventTrigger 只是将事件挂钩到动画。仅使用 XAML 无法满足您的要求。您可以实现您的要求的一种方法是将事件处理程序附加到 XAML 中的事件,然后在事件处理程序中执行条件部分。

      首先,您需要在Resources 部分中定义您的Storyboards,以便您可以从事件处理程序中访问它们。然后,您可以检查您的 bool 变量的值,如果它是 true,则以编程方式从那里启动 Storyboard

      Resources:

      <Window.Resources>
          <Storyboard x:Key="YourStoryboard" ... />
      </Window.Resources>
      

      在 XAML 中:

      <UserControl.Resources>
          <DataTemplate x:Key="DataTemplateItemDirect">
                  ...
               <Border Name="borderItem" DataContext="{Binding}" 
                   MouseEnter="MainWindow_MouseEnter" MouseLeave="MainWindow_MouseLeave" ... />
                  ...
          </DataTemplate>
      </UserControl.Resources>
      

      在事件处理程序中:

      private void MainWindow_MouseEnter(object sender, RoutedEventArgs e)
      {
          if ((sender.DataContext).YourBoolVariable)
          {
              Storyboard storyboard = (Storyboard)FindResource("YourStoryboard");
              Storyboard.SetTarget(storyboard , YourControl);
              storyboard.Begin();
          }
      }
      

      更新>>>

      为了单独处理多个动画,您可以将YourBoolVariable 添加到您的数据项类中(这样每个动画都有一个)。然后在DataTemplate 中,您可以将BorderDataContext 设置为数据绑定项,然后在事件处理程序中检索它。代码示例已更新以反映这一点。

      【讨论】:

      • 很遗憾,处理程序在 EventTrigger 中无法识别! :(
      • 是的,抱歉,我在考虑EventSetter Class...我已经更正了错误。
      • 我还有一个问题。我认为如果我们这样做,我们将遇到一个新问题。因为我已经为每一个 ListBoxItems 定义了 StoryBoards。 :(
      • 我还是有这个问题。有什么办法可以解决这个问题吗? tnx
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多