2016-08-17 22 views
0

オドメータのような数字をアニメートするXAMLアニメーションがあります。私はこのアニメーションの6つのほぼ同じだが異なるバージョンを作る必要がある。これまでアニメーションXAMLをこのように再利用する良い方法はないと私が知る限り、コードDRYを維持するために、私はプログラム的なアニメーションの作成に目を向ける。私のターゲットが見つからない、私が問題に実行したC#にこのXAMLアニメーション変換しようとしてUWP XAMLアニメーションをC#に変換する

:。

んがインストールされたコンポーネントが検出されなかったが、\ rを\ nは\ rを\ nCannot解決TargetName Digit1。

Storyboard.SetTargetName()の代わりにStoryboard.SetTarget()を呼び出すと、この例外は発生しませんが、画面に何も表示されません。

私がこの翻訳で間違っていることを誰かに教えてもらえますか?

XAML:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d"> 

    <Page.Resources> 
     <x:Double x:Key="OdometerMoveUpDistance">-101</x:Double> 

     <Storyboard x:Name="OdometerUpStoryboard"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" 
              Storyboard.TargetName="Digit1"> 
       <EasingDoubleKeyFrame KeyTime="0" Value="0" /> 
       <EasingDoubleKeyFrame KeyTime="0:0:1" Value="{StaticResource OdometerMoveUpDistance}" /> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </Page.Resources> 

    <Canvas x:Name="Odometer" Width="100" Height="100"> 
     <TextBlock x:Name="Digit1" FontSize="100" Text="8"> 
      <TextBlock.RenderTransform><CompositeTransform /></TextBlock.RenderTransform> 
     </TextBlock> 
    </Canvas> 

</Page> 

のC#:

private void Btn_Click(object sender, RoutedEventArgs e) 
{ 
    DoubleAnimationUsingKeyFrames digitUp = CreateOdometerdigitAnim(this.Digit1, 0, -101); 

    var storyboard = new Storyboard(); 
    storyboard.Children.Add(digitUp); 
    storyboard.Begin(); // Exception happens on this line 
} 

private DoubleAnimationUsingKeyFrames CreateOdometerdigitAnim(TextBlock digit, double startPos, double endPos) 
{ 
    var start = new EasingDoubleKeyFrame(); 
    start.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)); 
    start.Value = startPos; 

    var end = new EasingDoubleKeyFrame(); 
    end.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(1000)); 
    end.Value = endPos; 

    var anim = new DoubleAnimationUsingKeyFrames(); 
    anim.KeyFrames.Add(start); 
    anim.KeyFrames.Add(end); 

    Storyboard.SetTargetProperty(anim, "(UIElement.RenderTransform).(CompositeTransform.TranslateY)"); 
    Storyboard.SetTargetName(anim, digit.Name); 

    /* Using SetTarget instead of SetTargetName throws no exception but still does not animate */ 
    // Storyboard.SetTarget(anim, digit); 

    return anim; 
} 
+1

これはPITAでもかまいません。通常、コードビハインドでアニメーションとやりとりする必要がある場合は、xamlのリソースとして定義し、コードビハインドのリソースからアニメーションを取得します。それを変換する手間を省きます。 – Will

答えて

1

私はStoryboard.SetTarget()の代わりに、Storyboard.SetTargetName()を呼び出すと、私はもはや、この例外を取得していないが、まだ何も上起こりませんスクリーン。

Digit1.RenderTransformCompositeTransformオブジェクトを与える必要があります。 XAMLでの場合

<TextBlock x:Name="Digit1" FontSize="100" Text="8"> 
    <TextBlock.RenderTransform> 
     <CompositeTransform /> 
    </TextBlock.RenderTransform> 
</TextBlock> 

コードビハインドであれば、以下のようにstoryboard.Begin()前にコードを追加します。あなたは、XAMLまたはコードビハインドのいずれかでそれを行うことができます

Digit1.RenderTransform = new CompositeTransform(); 
... 
storyboard.Begin(); 

このXAMLアニメーションをC#に変換しようとすると、ターゲットが見つからない問題が発生しました:

インストールされていないコンポーネントw検出されました。\ r \ n \ r \ n TargetName Digit1を解決できません。

コードで問題を再現できます。 StoryBoard + Animationを定義したXAMLで試してみましたが、すべて正常に動作します。後で内部チャネルを通じていくつかの確認が必要です。

+0

ありがとうございました!私の謝罪は、私がXAMLに「CompositeTransform」を持っていたことが判明しました。Blendがそれを追加したためですが、私の目的が分かりませんでした。自分の問題が再現可能であると聞いてうれしく思います。根本的な原因について収集できる情報は非常に役立ちます。 –

+0

'Storyboard.SetTarget()'は正常に動作するはずです。 'Storyboard.SetTargetName'については、私は内部チャネルを介していくつかの確認が必要です、私はあなたに何か応答がある場合はお知らせします。 –

関連する問題