2011-10-01 61 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'內激活一個屬性,開始(代碼) –