C# 如何反转事件触发器

C# 如何反转事件触发器,c#,wpf,xaml,C#,Wpf,Xaml,我有一个EventTrigger动画,可以在单击时更改文本块的不透明度。 此触发器用于在用户单击我的文本块时隐藏它。 它工作得很好 但是,我不知道如何逆转这个EventTrigger-恢复不透明度- 当我试图在代码隐藏中更改触发器时,触发器具有优先级,因此无法工作。 我曾经考虑过创建一个新的EventTrigger,它的作用正好相反,但是我不知道是否可以在我的代码中调用它 仅当用户单击按钮时,“我的文本块”才为Hide=True。这是一个错误文本块。 用户可以单击它来隐藏它。 如果用户再次单击该

我有一个EventTrigger动画,可以在单击时更改文本块的不透明度。
此触发器用于在用户单击我的文本块时隐藏它。
它工作得很好

但是,我不知道如何逆转这个EventTrigger-恢复不透明度-

当我试图在代码隐藏中更改触发器时,触发器具有优先级,因此无法工作。
我曾经考虑过创建一个新的EventTrigger,它的作用正好相反,但是我不知道是否可以在我的代码中调用它

仅当用户单击按钮时,“我的文本块”才为Hide=True。这是一个错误文本块。
用户可以单击它来隐藏它。
如果用户再次单击该按钮,则此文本框现在将不透明度隐藏。
我必须从后面的代码中更改此不透明度,我不知道如何使用其他方法解决此问题

我的XAML:

<TextBlock x:Name="ErrorTextBlock">
    <TextBlock.Triggers>
        <EventTrigger RoutedEvent="TextBlock.MouseDown">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="ErrorTextBlock" 
                                     Storyboard.TargetProperty="Opacity" 
                                     From="1" To="0" Duration="0:0:2" 
                                     AutoReverse="False">

编辑:我没有找到问题的答案,但是我找到了另一个解决方案。 问题在于顺序——首先是动画,其次是代码。 因此,我只需编写XAML动画,将代码隐藏起来。
现在优先级已结束,问题已解决。=)

在我看来,您想要的行为可以总结为希望能够根据
文本块的当前状态将
调整到
动画中的值

我可以通过编写一个简单的
IValueConverter
并使用转换器将
TextBlock.Opacity
属性绑定到动画的
to
属性(当然,
Opacity
属性绑定到
From
属性,而不使用转换器)

转换器:

class SubtractFromConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is double && parameter is double)
        {
            double doubleValue = (double)value, doubleParameter = (double)parameter;

            return doubleParameter - doubleValue;
        }

        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}
我的简单测试XAML演示了这一点:

<StackPanel>
  <TextBlock x:Name="textBox1" FontSize="36" Text="Hello world!">
    <TextBlock.Triggers>
      <EventTrigger RoutedEvent="TextBlock.MouseDown">
        <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation Storyboard.TargetName="textBox1"
                             Storyboard.TargetProperty="Opacity"
                             From="{Binding ElementName=textBox1, Path=Opacity}"
                             Duration="0:0:2"
                             AutoReverse="False">
              <DoubleAnimation.To>
                <Binding ElementName="textBox1" Path="Opacity">
                  <Binding.Converter>
                    <local:SubtractFromConverter />
                  </Binding.Converter>
                  <Binding.ConverterParameter>
                    <system:Double>1.0</system:Double>
                  </Binding.ConverterParameter>
                </Binding>
              </DoubleAnimation.To>
            </DoubleAnimation>
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </TextBlock.Triggers>
  </TextBlock>
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="Opacity: " />
    <TextBlock Text="{Binding ElementName=textBox1, Path=Opacity}" />
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="Opacity: " />
    <TextBlock>
      <TextBlock.Text>
        <Binding ElementName="textBox1" Path="Opacity">
          <Binding.Converter>
            <local:SubtractFromConverter />
          </Binding.Converter>
          <Binding.ConverterParameter>
            <system:Double>1.0</system:Double>
          </Binding.ConverterParameter>
        </Binding>
      </TextBlock.Text>
    </TextBlock>
  </StackPanel>
</StackPanel>

1
1
每次单击
文本块
,它都会反转动画

注意:需要对您的零件进行一些额外的工作,以适应该技术,以确保动画始终按照您想要的方向运行。例如,不只是使用当前的
不透明度
值,而是绑定到跟踪当前切换状态的其他属性


但是我希望基本技术——使用绑定动态控制动画的
属性和
属性到
属性——是清楚的。

应该触发什么来恢复不透明度?在我的代码隐藏中:
ErrorTextBlock.opacity=1我不是专家,但你不能用XAML做所有的事情。如果这确实不可行,您需要一个布尔值来指示是否必须显示错误消息,并且无论何时更改此布尔值(在单击事件中),都可以在C#中启动故事板设置或取消设置不透明度(基于此布尔值)。这可能是一个不错的选择。我试试看。