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>

次に、2 番目の値を変数にバインドしたいと思います。

依存関係プロパティのチュートリアルを見つけて試してみました。私のコードはコンパイルして実行されますが、何も起こりません:(

これが私がやったことです:

作成された依存オブジェクト:

  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);
        }
    }
}

1 つのオブジェクトを作成しました:

    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.TargetNameLabelあなたが定義され ていると仮定しましょう:

<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 は Label をターゲットにしており (要素を好きなように変更してください。ストーリーボードが正しい要素を指していることを確認してください)、この例では 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: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 に答える