如何反转事件触发器

时间:2015-01-26 18:27:09

标签: c# wpf xaml

我有一个EventTrigger动画,可以在点击时更改TextBlock的不透明度 使用此触发器是在用户单击时隐藏我的TextBlock 它完美地运作。

但是,我无法弄清楚如何撤消此EventTrigger - 获取不透明度 - 。

当我尝试在我的代码隐藏中更改它时,触发器具有优先级,因此它不起作用 我已经考虑过创建一个新的EventTrigger来做相反的事情,但我不知道我是否可以在我的代码隐藏中调用它。

仅当用户点击按钮时,我的TextBlock才是Hide = True。这是一个错误TextBlock 用户可以点击它来隐藏它 如果用户再次单击该按钮,则此TextBox现在由不透明度隐藏 我必须从代​​码隐藏中改变这种不透明度我不知道如何用其他方法搞清楚。

我的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动画写成代码。 优先权现已结束,问题得到解决。 =)

1 个答案:

答案 0 :(得分:0)

在我看来,您希望的行为可以归结为希望能够根据From的当前状态调整动画中的ToTextBlock

我能够通过编写一个简单的IValueConverter并使用转换器将TextBlock.Opacity属性绑定到动画的To属性来实现此目的(当然,{没有转换器的Opacity属性的{1}}属性。

转换器:

From

我的简单测试XAML来演示它:

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;
    }
}

每次点击<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> 时,它都会反转动画。

注意:您需要做一些额外的工作来调整技术,以确保动画始终按照您想要的方向运行。例如,不是仅使用当前的TextBlock值,而是绑定到跟踪当前切换状态的其他属性。

但我希望基本技术 - 使用绑定来动态控制动画的OpacityFrom属性 - 很明显。