オドメータのような数字をアニメートする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;
}
これはPITAでもかまいません。通常、コードビハインドでアニメーションとやりとりする必要がある場合は、xamlのリソースとして定義し、コードビハインドのリソースからアニメーションを取得します。それを変換する手間を省きます。 – Will