2011-10-01 58 views
1

简单地说,我有这样的一个ControlTemplate.Triggers条件EnterAction内:与绑定属性故事板(自定义控件:动画颜色变化)

<ColorAnimation To="#fe7" Storyboard.TargetProperty="Background.Color" Duration="00:00:00.1" Storyboard.TargetName="brd"/> 

但我希望“到”色(#fe7)是定制。这是一个来自ListBox的控件。我可以创建一个DependencyProperty,但是当然,我不能将的To属性绑定到它,因为Storyboard必须被冻结,并且不能使用绑定冻结某些东西(据我了解)。

我试图用一个{StaticResource}To内,然后填充在代码隐藏的资源时,DependencyProperty改变,通过例如设置this.Resources["ItemColour"] = newValue;。这显然不起作用,毕竟它是一个静态资源:没有新的属性值被选中。 DynamicResource给出了无法冻结的相同问题。

属性只在控件创建时设置一次,我不必担心它会改变中间动画。

有没有这样做的好方法?我必须自己动手寻找财产变化,动态地调用和管理那时的故事板?或者覆盖控件的两个版本,开始和结束颜色,并改变Opacity的动画效果?双方似乎可笑..

回答

0

事实证明,这根本是不可能的。

0

ü可以把多个DataTriggers每个都具有各自颜色的“到”财产......

+1

你能解释一下,请多一点,我不明白?控件的用户将能够指定00000000-ffffffff,即40亿种颜色中的1种,每种颜色一次触发,当然不是? :) –

0

当然不是.. 我明白,就是你希望在条件颜色的和颜色B上的其他条件B ....所以如果有一个属性有多个选项,你可以把这些条件的数据触发器...只要作业完成=红色,半完成=绿色像智慧.. 如果我误解了问题请纠正我..

我想我得到你的问题... UR控制是用户可配置,所以什么用户选择,控制的背景需要设置为该颜色无线th动画是否正确?

+0

不,谢谢,但你误会了。我说我想让动画的“To”可以定制 - 可以绑定到用户可以指定的东西。如果你能告诉我如何克服你无法使用绑定的限制(因为Storyboards必须被冻结),那么请回答一些说明你的解决方案的东西。 –

2

Kieren,

这会为您服务吗?

我已经扩展名为CustomGrid网格类并创建了一个TestProperty改变将改变电网的背景颜色,当其值:

public class CustomGrid : Grid 
    { 
     public bool Test 
     { 
      get 
      { 
       return (bool)GetValue(TestProperty); 
      } 
      set 
      { 
       SetValue(TestProperty, value); 
      } 
     } 
     public static readonly DependencyProperty TestProperty = 
      DependencyProperty.Register("Test", typeof(bool), typeof(CustomGrid), 
       new PropertyMetadata(new PropertyChangedCallback 
        ((obj, propChanged) => 
        { 

         CustomGrid control = obj as CustomGrid; 
         if (control != null) 
         { 
          Storyboard sb = new Storyboard() { Duration = new Duration(TimeSpan.FromMilliseconds(500)) }; 

          Random rand = new Random(); 
          Color col = new Color() 
          { 
           A = 100, 
           R = (byte)(rand.Next() % 255), 
           G = (byte)(rand.Next() % 255), 
           B = (byte)(rand.Next() % 255) 
          }; 


          ColorAnimation colAnim = new ColorAnimation(); 

          colAnim.To = col; 
          colAnim.Duration = new Duration(TimeSpan.FromMilliseconds(500)); 


          sb.Children.Add(colAnim); 
          Storyboard.SetTarget(colAnim, control); 
          Storyboard.SetTargetProperty(colAnim, new PropertyPath("(Panel.Background).(SolidColorBrush.Color)")); 

          sb.Begin(); 

         } 
        } 
       ))); 
    } 

这是按钮点击事件改变颜色:

private void btnClick_Click(object sender, RoutedEventArgs e) 
     { 
      gridCustom.Test = (gridCustom.Test == true) ? false : true; 
     } 

我正在更改网格的背景颜色,因为我没有您的列表框。

最后是这样的XAML:

<Grid x:Name="grid" Background="White"> 
     <local:CustomGrid x:Name="gridCustom" Background="Pink" Height="100" Margin="104,109,112,102" > 

     </local:CustomGrid> 
     <Button Content="Click Me" x:Name="btnClick" Height="45" HorizontalAlignment="Left" Margin="104,12,0,0" VerticalAlignment="Top" Width="145" Click="btnClick_Click" /> 
    </Grid> 

这是否会为你的目的是什么?让我知道还是我误解了这个问题?

编辑:

看到这个代码:

ColorAnimation的财产权,你可能已经猜到了无法绑定。但这并不意味着你无法改变它的价值。您可以随时获得对ColorAnimation的参考,并将其更改为值,并且一切运行良好。因此,从WPF的绑定世界中,我们需要改变一下,并绑定数据,我们在Winforms中如何使用它。作为一个例子来看看这个:

这是XAML:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Class="ControlTemplateTriggers.MainWindow" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 

     <Storyboard x:Key="Storyboard"> 
      <ColorAnimation From="Black" To="Red" Duration="00:00:00.500" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="gridCustom" /> 
     </Storyboard> 
    </Window.Resources> 

    <Grid x:Name="grid" Background="White"> 
     <Grid x:Name="gridCustom" Background="Pink" Height="100" Margin="104,109,112,102" /> 

     <Button Content="Click Me" x:Name="btnClick" Height="45" HorizontalAlignment="Left" Margin="104,12,0,0" VerticalAlignment="Top" Width="145" Click="btnClick_Click" /> 
    </Grid> 
</Window> 

这是后面的代码:

using System.Windows; 
using System.Windows.Media.Animation; 
using System.Windows.Media; 
using System; 

namespace Sample { 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 

     } 

     private void btnClick_Click(object sender, RoutedEventArgs e) 
     { 
      Storyboard sb = this.Resources["Storyboard"] as Storyboard; 
      if (sb != null) 
      { 
       ColorAnimation frame = sb.Children[0] as ColorAnimation; 
       Random rand = new Random(); 
       Color col = new Color() 
           { 
            A = 100, 
            R = (byte)(rand.Next() % 255), 
            G = (byte)(rand.Next() % 255), 
            B = (byte)(rand.Next() % 255) 
           }; 
       frame.To = col; 
       sb.Begin(); 
      } 
     } 
    } 


} 

正如你可以看到我正在给故事板的引用,并改变其财产。你对StaticResource的方法显然不起作用。现在你可以做的是,在你的DependencyProperty回调中以某种方式得到你想要动画并使用VisualTreeHelper或其他东西的时间轴的引用,然后设置它的To属性。

这是你最好的选择。

让我知道这是否解决您的问题:)

+0

这是我的一个倒退技巧:以编程方式创建故事板。我在问这个问题,看看是否有另一种方法来实现这一点,而不必在代码隐藏方面进行破解? –

+0

@KierenJohnstone:看我的编辑。希望它可以解决你的问题:) – TCM

+0

不能,因为在这里:http://msdn.microsoft.com/en-us/library/ms742868.aspx如果你使用''ControlTemplate''调用你不能在'ControlTemplate'内激活一个属性,开始(代码) –