5

Metro XAMLアプリでいくつかのストーリーボードを使いこなしています。私は、コード内のStoryboardを作成する必要があります。 XAMLは、このようになりますで私がStoryboard.TargetPropertyStoryboard.TargetPropertyをCompositeTransformに設定できません。コードからMetroスタイルアプリの回転

...

それは不可能だCompositeTransform.Rotationへの私のストーリーボードを設定したいと思います:

<Storyboard> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="grid"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="60"/ 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

私は似たものを作成したいと思います。重要
私はこの正確なストーリーボード再作成しようとしておりません。私は、カスタムContentControlのコードの中だ、そうthisControlある、とにアニメーションをターゲットとするための「グリッド」はありません。ターゲットはCompositeTransformが予め設定した制御自体、です。

私のコード今のところ、このようなものです:

var turnSB = new Storyboard(); 

var doubleAnim = new DoubleAnimationUsingKeyFrames(); 
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = currentAngle }); 
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = targetAngle }); 

turnSB.Children.Add(doubleAnim); 

Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)"); 

turnSB.Begin(); 

とすぐに、それは私が(CompositeTransform.Rotation)は解決できないという例外を取得開始方法を打つよう。だから、私は物件の道が間違っていないと思っています。私はさまざまなバリエーションを試しましたが、PropertyPathsによると、これは正しいものでなければなりませんか? :これは解決不可能な問題S

であれば、私は回避策の提案に開いている...

EDIT:

私は今の問題を解決してきたと思います。私は実質的に何もすることができ、ユーザーコントロールを作成した場合、私は

...しかし、いくつかの興味深い調査結果があります。すべてが動作しますが、私はStoryboard.Targetpropertyを設定することができ、そしてアニメーションが正しく再生されます。

カスタムコントロールを使用するか、別のコントロール(ContentControlなど)から継承した場合、コードからストーリーボードを開始できない場合があります。

例:Rotation(またはその問題の変換プロパティ)をアニメーション化し、コードから開始しようとするストーリーボード(XAMLで定義)を作成すると、上記の例外が発生します。しかし、単純なプロパティをアニメーション化した場合、Opacityと言っても問題ありません。
(私はUserControlで同じことをやっていました。)

誰かがこれを説明できますか?

+0

私は、グリッドコントロールからクラスを継承した、同じ問題を抱えています、絵コンテは、単に」勝ちましたtスタート。 –

+0

グリッドはControlから継承されないため、作成するカスタムコントロールではありません。 –

+0

私はグリッドを使用していなかった、私はContentControlから継承していた。 xamlは以前の試行のもので、そこにはグリッドを持つUserControlがあり、それがアニメーションのターゲットでした。しかし、このような状況では、ターゲットはコントロール自体でなければなりません。あなたが慎重に読んだ場合、私は「重要」のセクションで説明しました。 – Tenshiko

答えて

4

MSDN docsから、文字列パス全体を設定する必要があるようです。 このblog postを発見ストーリーボードの子としてタイムラインに追加します。だからあなたのXAMLで記述アニメーションのために、あなたは

Storyboard.SetTargetProperty(doubleAnim, "(UIElement.RenderTransform).(CompositeTransform.Rotation)"); 

なUPDATEとしてTargetPropertyを設定する必要があります。次のことを試してみてください。

Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
Storyboard.SetTargetProperty(doubleAnim, "Rotation"); // maybe "CompositeTransform.Rotation" 
storyboard.Children.Add(doubleAnim); 
+0

私はこれらのすべての組み合わせを試してみました。結果は常に同じでした。 – Tenshiko

+0

ストーリーボードの設定に問題がないと結論づけました。実際、最初の提案は現在では動作しますが、UserControlsのみで動作します。私はこのテーマについてもっと知りたいと思うかもしれません。しかし、そうでなければ、私はあなたの答えを受け入れるでしょう。 Thx :) – Tenshiko

+0

これはカスタムコントロール内ですか? –

4

私はあなたがカスタムコントロールのRenderTransformプロパティをインスタンス化していないので、このエラーが発生した理由があると思います。上記のコードで

public class CustomControl2 : Control 
{ 
    public CustomControl2() 
    { 
     this.DefaultStyleKey = typeof(CustomControl2); 
    } 

    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
    } 

    public void RunAnimation() 
    { 
     //this.RenderTransform = new CompositeTransform(); 
     this.Background = new SolidColorBrush(Color.FromArgb(0xFF, 0x33, 0xC8, 0x9C)); 

     var turnSB = new Storyboard(); 

     var doubleAnim = new DoubleAnimationUsingKeyFrames(); 
     doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 10 }); 
     doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = 30 }); 

     turnSB.Children.Add(doubleAnim); 

     Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
     Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)"); 

     turnSB.Begin(); 
    } 
} 

注意私はこの方法RunAnimation下の最初の行をコメントアウトした場合、それは私にあなたが取得している同じエラーがスローされます。

このコントロールをメインページに作成し、Buttonを作成してアニメーションを開始しました。

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    this.MyControl.RunAnimation(); 
} 

私は上記のコードをテストし、うまくいきました。

+0

私はこれがうまくいかない理由を知っていますが、私がオリジナルの投稿で言ったように私は変換を設定しました(再度 '重要'のセクションをお読みください)。そして、もっと簡単な解決策で同じ効果を再現することができました。私はそれをもう一度チェックし、あなたに戻ってみましょう。 – Tenshiko

+0

私が考えることのできることは、OnApplyTemplateが呼び出される前にanmiationを開始することでしょうか? –

1

問題がyoureの使用要素へのパスであり、そのは、そのプロパティ自体に延びる親クラスから派生しなければならないITを

を解決しました。私自身のコントロールで働いて、それはあなたがペースト(未テストコード)をコピーすることができ、小さな例を作った私がいる:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Media.Animation; 

namespace CustomControls 
{ 
    /// <summary> 
    /// Author: Frank Wolferink 
    /// Note: example is untested and comes as is. I hope it save's you the time i lost figering this out 
    /// </summary> 
    public class CustomControl : Control 
    { 

     private Storyboard _compositeTransformExampleStoryBoard; 

     private const string TRANSLATE_X_TARGET = "Control.RenderTransform.CompositeTransform.TranslateX"; 
     private const string TRANSLATE_Y_TARGET = "Control.RenderTransform.CompositeTransform.TranslateY"; 
     private const string TRANSLATE_ROTATE_TARGET = "Control.RenderTransform.CompositeTransform.Rotation"; 


     public CustomControl() 
     { 
      this.RenderTransform = new CompositeTransform(); 

      TimeSpan duration = new TimeSpan(0,0,0,0,500); 
      double translateX = 10; 
      double translateY = 10; 
      double rotation = 40; 

      _compositeTransformExampleStoryBoard = BuildStoryboard(duration, translateX, translateY, rotation); 

      this.Loaded += CustomControl_Loaded; 
     } 

     void CustomControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      _compositeTransformExampleStoryBoard.Begin(); 
     } 


     private Storyboard BuildStoryboard(TimeSpan animationDuration, double transistionValueX, double transistionValueY, double rotation) 
     { 
      Storyboard storyboard = new Storyboard(); 

      if (transistionValueX != 0) 
       CreateAnimation(storyboard, transistionValueX, animationDuration, TRANSLATE_X_TARGET); 

      if (transistionValueY != 0) 
       CreateAnimation(storyboard, transistionValueY, animationDuration, TRANSLATE_Y_TARGET); 

      if (rotation != 0) 
       CreateAnimation(storyboard, rotation, animationDuration, TRANSLATE_ROTATE_TARGET); 


      return storyboard; 
     } 

     private void CreateAnimation(Storyboard storyboard, double transistionValue, TimeSpan animationDuration, string targetProperty) 
     { 
      DoubleAnimation da = CreateDoubleAnimation(transistionValue, animationDuration); 
      storyboard.Children.Add(da); 
      Storyboard.SetTarget(da, this); 
      Storyboard.SetTargetProperty(da, targetProperty); 
     } 

     private DoubleAnimation CreateDoubleAnimation(double transistionValue, TimeSpan duration) 
     { 
      return new DoubleAnimation() 
      { 
       Duration = duration, 
       To = transistionValue 
      }; 
     } 

    } 
} 

関連する問題