1

我有以下 WPF 窗口:

<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 属性,但没有任何反应。这就像动画不会开始。任何人都可以指出我错在哪里?

提前致谢。

4

2 回答 2

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 的值调用...看起来它工作得很好。

于 2013-05-15T11:13:22.057 回答
0

WPF 不会调用您作为 DependencyProperty 的包装器编写的属性。它将直接转到您的 DependencyObject。您可以像以前一样将回调传递给 DependencyObject 注册,这应该被调用。你可能想在那里调试。

于 2013-05-15T11:01:54.743 回答