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