2015-01-26 61 views
0

我有一个EventTrigger动画,它可以在单击时更改TextBlock的不透明度。
这个触发器的用途是当用户点击它时隐藏我的TextBlock。
它完美的作品。如何颠倒事件触发器

不过,我想不通我怎么能扭转这种EventTrigger - 获取透明度回 - 。

当我尝试在我的代码隐藏中更改它时,触发器具有优先级,因此它不起作用。
我曾经想过创建一个新的EventTrigger其仍然做相反的事情,我不知道如果我能在我的代码隐藏调用它..

我的TextBlock是隐藏=上的按钮真只有当用户点击。这是一个错误TextBlock。
用户可以点击它来隐藏它。
如果用户再次点击按钮,这个文本框现在被不透明度隐藏。
我必须从代​​码隐藏中更改这种不透明度我看不出如何用其他方法计算出来。

我的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

什么是应该触发得到不透明度? – BradleyDotNET 2015-01-26 18:28:14

+0

在我的代码隐藏:'ErrorTextBlock.Opacity = 1;' – C0ZEN 2015-01-26 18:34:48

+0

我不是专家,但你不能在XAML中做所有事情。如果这确实是不可行的,你需要的是一个布尔值来指示是否显示错误消息,并且当你改变这个布尔值(在你的点击事件中)时,在C#设置中启动一个故事板或取消设置不透明度(基于这个布尔值)。 – Kilazur 2015-01-26 18:44:01

回答

0

在我看来,根据TextBlock的当前状态,您希望能够调整动画中的FromTo值,以期望您的行为总结。

我能够写一个简单的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> 

我每次点击TextBlock,它反转动画。

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

但我希望的基本技术–用结合动态控制动画–是明确的FromTo性能。