0

溢出!C中雙動畫的依賴屬性#

我想爲WP編寫一個變量動畫。

我創建動畫與Expression Blend的是這樣的:

<Storyboard x:Name="rotateC"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="currentDeviancePointer_s"> 
      <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="10"/> 
     </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

現在我想第二個值綁定到一個變量。

我找到了依賴屬性的教程並試用了它們。我的代碼編譯和運行,但沒有任何反應:(

這裏是我做了什麼:

產生了依賴對象:

public class RotateClass : DependencyObject 
    { 
    public static readonly DependencyProperty NewAngleProperty = 
     DependencyProperty.Register("newAngle", typeof(double), typeof(RotateClass), new PropertyMetadata(10.0)); 

    public double newAngle 
    { 
     get 
     { 
      return (double)GetValue(NewAngleProperty); 
     } 
     set 
     { 
      SetValue(NewAngleProperty, (double)value); 
     } 
    } 
} 

創建一個對象:

public MainPage() 
    { 
     InitializeComponent(); 

     ... 

     angleContainer= new RotateClass(); 

     ... 
    } 

我創建帶以下處理程序的按鈕:

angleContainer.newAngle = 45; 


if (rotateC.GetCurrentState() != ClockState.Active) 
{ 
    rotateC.Begin(); 
} 

,這裏是我的綁定:

<Storyboard x:Name="rotateC"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="currentDeviancePointer_s"> 
      <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="{Binding ElementName=angleContainer,Path=newAngle}"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 

有沒有搞錯?

也許我這樣做太困難了?還有其他解決方案嗎? 謝謝你的幫助!

+0

爲什麼你有一個類擴展'DependencyObject' ......你不能簡單地綁定到一個'DependencyProperty'?你在使用MVVM嗎?任何框架? – Noctis

+0

我剛剛安裝了WP8 SDK。沒什麼特別的。我也試過只使用依賴屬性,沒有任何類,但它沒有工作。 – user2919026

回答

1

好吧,假設你旋轉的定義如下:

<Window.Resources> 
    ... 
    <Storyboard x:Key="RotateC"> 
    <DoubleAnimationUsingKeyFrames 
     Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
     Storyboard.TargetName="currentDeviancePointer_s"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:1" Value="{Binding ValueToRotate}"/> 
    </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</Window.Resources> 

首先,請注意您所需要的x:Key這裏,不是名字。這根據您的窗口或用戶控件資源,在根元素之前。 其次,請注意,我將該值綁定到ValueToRotate。這將是一個您將附加到的DependencyProperty。
我也設置了Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle),所以它會改變元素的角度。

您需要有一個名稱爲currentDeviancePointer_s的元素,因爲這是您在Storyboard.TargetName中所擁有的元素。讓我們假設你有一個Label定義:

<Label Name="currentDeviancePointer_s" .../> 

現在你的故事板指向標籤(通過Storyboard.TargetName

創建依賴屬性:

public static readonly DependencyProperty RotateToValueProperty = 
     DependencyProperty.Register("RotateToValue", typeof (double), typeof (MainWindow), new PropertyMetadata(default(double))); 

    public double RotateToValue 
    { 
     get { return (double)GetValue(RotateToValueProperty); } 
     set { SetValue(RotateToValueProperty, value); } 
    } 

隨意在對其進行初始化ctor,或將其綁定到不同的元素或任何你想做的事情......

public MainWindow() 
{ 
    InitializeComponent(); 
    ... 
    RotateToValue = 45; 
     ... 
} 

假設這是你的按鈕:

<Button Content="Lets rotate something"> 
    <Button.Triggers> 
    <EventTrigger RoutedEvent="ButtonBase.Click"> 
     <BeginStoryboard Storyboard="{Binding Source={StaticResource RotateC}}"/> 
    </EventTrigger> 
    </Button.Triggers> 
</Button> 

你可以看到它有一個TRIGER一次單擊該按鈕時,將設置我們在運動中的資源定義的故事板。
該故事板是針對標籤(將元素更改爲任何你想要的,只要確保你的故事板指向正確的元素),你會看到它在我們的情況下旋轉45度(因爲我們將RotateToValue設置爲45

完成:)。

編輯: 如果你堅持使用begin: 1.確保你的窗口有一個名字:

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Name="Window_name_here"> 

你並不需要的名字寫在你Storyboard中,x :關鍵就夠了。我假設它仍然RotateC

在後面的代碼,使用不同的按鈕,點擊裏面(這樣你就可以看到它的工作):

((Storyboard)Window_name_here.Resources["RotateC"]).Begin(); 
+0

非常感謝。我有一個問題: - 如何從C#代碼中觸發此動畫?沒有x:Name我不能使用.Begin()。但是,如果我更改x:關鍵x:命名我的應用程序崩潰:) – user2919026

+0

我已經做了一切,但似乎沒有工作。如果我將價值更改爲「10」 - 一切正常。如果我改回它綁定,沒有任何反應。也許有一些與ElementName或路徑? 謝謝! – user2919026

0

一切,Noctis說是正確的!唯一被遺忘的事情是:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

現在它的工作!

+0

很高興它的工作。 – Noctis