2013-05-15 39 views
1

我有以下WPF窗口:爲什麼自定義依賴項屬性不是由DoubleAnimation動畫的?

<Window x:Class="AnimationTest.MainWindow" 
    x:Name="main" 

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" > 

<Window.Resources> 
    <Storyboard RepeatBehavior="Forever" x:Key="animationStoryboard" TargetName="main" TargetProperty="CurrentOffset" > 
     <DoubleAnimation From="0" To="100" Duration="0:0:5" SpeedRatio=".8" AutoReverse="True" /> 
    </Storyboard> 
</Window.Resources> 

<Grid> 

</Grid> 
</Window> 

隨着後面的下面的代碼:

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

namespace AnimationTest 
{ 
public partial class MainWindow : Window 
{ 
    public static DependencyProperty CurrentOffsetProperty = DependencyProperty.Register("CurrentOffset", typeof(double), typeof(MainWindow), new FrameworkPropertyMetadata(OnCurrentOffsetPropertyChanged)); 

    private static void OnCurrentOffsetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     MainWindow control = (MainWindow)d; 
    } 

    public double CurrentOffset 
    { 
     get 
     { 
      return (double)base.GetValue(MainWindow.CurrentOffsetProperty); 
     } 
     set 
     { 
      MessageBox.Show("Hit"); 
      base.SetValue(MainWindow.CurrentOffsetProperty, value); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     ((Storyboard)base.FindResource("animationStoryboard")).Begin(this); 
    } 
} 
} 

我預計將有CurrentOffset財產時間可持續電話了,但是什麼也沒有發生。這就像動畫不會啓動。任何人都可以指出我錯在哪裏?

在此先感謝。

+0

以及AFAIK在您的文件的DP屬性定義從未被調用框架和代碼訪問DP落後時它只是作爲一個輔助你。所以即使動畫運行良好,您的MessageBox.Show()也不會被底層WPF系統調用。您是否嘗試在動畫完成後檢查DP的值以檢查其存儲值? – Viv

+1

參見[這篇文章](http://msdn.microsoft.com/en-us/library/bb613563.aspx)對於什麼薇薇說的解釋(和移動'MessageBox.Show()'調用的'OnCurrentOffsetPropertyChanged '看看動畫是否有效)。 – Clemens

回答

1

添加到我以前的評論和@Clemens

只是想你自己的代碼,並能正常工作。您必須在PropertyChanged處理程序中「做功」,但DP按預期工作。

我修改你的故事板不重複測試DP值,如:

<Storyboard x:Key="animationStoryboard" 
      TargetProperty="CurrentOffset" 
      TargetName="main"> 
    <DoubleAnimation Duration="0:0:5" 
        From="0" 
        SpeedRatio=".8" 
        To="100" /> 
</Storyboard> 

和後臺代碼:

public MainWindow() { 
    InitializeComponent(); 
    var sb = ((Storyboard)base.FindResource("animationStoryboard")); 
    sb.Completed += (sender, args) => MessageBox.Show(CurrentOffset.ToString()); 
    sb.Begin(); 
} 

MessageBox用的99.8888值調用...這看起來好像很好。

+0

感謝隊友。我沒有意識到這一點! –

0

你寫爲您的DependencyProperty的包裝性能不會受到WPF調用。它將直接進入你的DependencyObject。您可以像回覆一樣將回調傳遞給DependencyObject註冊,應調用。你可能想在那裏調試。

相關問題