0

溢出!

我想为 WP 编写一个变量 Animation。

我用 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>

现在我想将第二个值绑定到一个变量。

我找到了 Dependency Properties 的教程并进行了尝试。我的代码编译并运行,但没有任何反应:(

这是我所做的:

创建的依赖对象:

  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>

有什么错误吗?

也许我这样做太难了?还有其他解决方案吗?谢谢您的帮助!

4

2 回答 2

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>

您可以看到它有一个触发器,一旦单击按钮,就会启动我们在资源中定义的 Storyboard。
该情节提要针对标签(将元素更改为您想要的任何内容,只需确保您的情节提要指向正确的元素),在我们的例子中您会看到它旋转 45 度(因为我们将 RotateToValue 设置为 45.

完毕 :)。

编辑: 如果您坚持使用开始: 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:Key 就足够了。我假设它仍然RotateC

在您的代码后面,在不同的按钮单击中使用它(这样您就可以看到它工作):

((Storyboard)Window_name_here.Resources["RotateC"]).Begin();
于 2013-10-25T12:37:52.010 回答
0

诺克提斯所说的一切都是正确的!唯一忘记的事情是:

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

现在它起作用了!

于 2013-10-28T21:53:21.247 回答