0

次のアニメーションを実装するカスタムUserControlがあります。

<UserControl.Resources>
    <QuinticEase Core:Key="EasingInOut" EasingMode="EaseInOut"/>
    <Storyboard Core:Key="AnimationHide">
        <DoubleAnimation Storyboard.TargetName="m_Front" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" BeginTime="00:00:00.0" Duration="00:00:00.1" EasingFunction="{StaticResource EasingInOut}" To="0"/>
        <DoubleAnimation Storyboard.TargetName="m_Back" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" BeginTime="00:00:00.1" Duration="00:00:00.1" EasingFunction="{StaticResource EasingInOut}" To="1"/>
    </Storyboard>
    <Storyboard Core:Key="AnimationShow">
        <DoubleAnimation Storyboard.TargetName="m_Back" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" BeginTime="00:00:00.0" Duration="00:00:00.1" EasingFunction="{StaticResource EasingInOut}" To="0"/>
        <DoubleAnimation Storyboard.TargetName="m_Front" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" BeginTime="00:00:00.1" Duration="00:00:00.1" EasingFunction="{StaticResource EasingInOut}" To="1"/>
    </Storyboard>
</UserControl.Resources>

そして、次の構造を持っています:

<Canvas>
    <Grid Core:Name="m_Front" Height="{Core:Static Namespace:Card.RealHeight}" RenderTransformOrigin="0.5,0.5" Width="{Core:Static Namespace:Card.RealWidth}">
        <Grid.RenderTransform>
            <ScaleTransform ScaleX="0"/>
        </Grid.RenderTransform>
        <Image Core:Name="m_FrontImage" RenderOptions.BitmapScalingMode="HighQuality" RenderOptions.EdgeMode="Aliased" HorizontalAlignment="Left" Source="{Binding Source={Core:Static Properties:Resources.Fronts}, Converter={StaticResource ImagesConverter}}" Stretch="None" VerticalAlignment="Top">
            <Image.Clip>
                <RectangleGeometry Core:Name="m_FrontClipping"/>
            </Image.Clip>
            <Image.RenderTransform>
                <TranslateTransform Core:Name="m_FrontTranslation"/>
            </Image.RenderTransform>
        </Image>
    </Grid>
    <Grid Core:Name="m_Back" Canvas.Left="0" Canvas.Top="0" RenderTransformOrigin="0.5,0.5">
        <Grid.RenderTransform>
            <ScaleTransform/>
        </Grid.RenderTransform>
        <Image RenderOptions.BitmapScalingMode="HighQuality" RenderOptions.EdgeMode="Aliased" HorizontalAlignment="Left" Source="{Binding Source={Core:Static Properties:Resources.Back}, Converter={StaticResource ImagesConverter}}" Stretch="None" VerticalAlignment="Top"/>
    </Grid>
</Canvas>

UserControlコードでこれらのアニメーションの1つを実行すると、すべてが完全に正常に機能します。

Storyboard show = (Storyboard)Resources["AnimationShow"];
show.Begin();

今...私はUserControl自体の外部からそのアニメーションをシミュレートしようとしていました(正確には、MainWindow.csコードの背後にあります):

DoubleAnimation animationKick1 = new DoubleAnimation();
animationKick1.BeginTime = beginTime;
animationKick1.Duration = TimeSpan.FromSeconds(0.125D);
animationKick1.To = 0D;
animationKick1.SetValue(Storyboard.TargetProperty, myUC.m_Front);
animationKick1.SetValue(Storyboard.TargetPropertyProperty, CreatePropertyPath("RenderTransform.(ScaleTransform.ScaleX)"));

DoubleAnimation animationKick2 = new DoubleAnimation();
animationKick2.BeginTime = beginTime;
animationKick2.Duration = TimeSpan.FromSeconds(0.125D);
animationKick2.To = 1D;
animationKick2.SetValue(Storyboard.TargetProperty, myUC.m_Back);
animationKick2.SetValue(Storyboard.TargetPropertyProperty, CreatePropertyPath("RenderTransform.(ScaleTransform.ScaleX)"));

しかし、何も起こりません...なぜですか?UserControl要素を外部からアニメーション化するにはどうすればよいですか?

4

1 に答える 1

2

アニメーションを実行するには、UserControl でメソッドを公開するだけのほうがよいでしょう。おそらく、プロパティ パスでスコープの問題が発生しているでしょう。メイン ウィンドウからユーザー コントロールの内部にアクセスしようとすることは、カプセル化の基本原則に従っていません。アニメーション コードを MainWindow に保持する説得力のある理由はありますか?

于 2013-03-07T17:39:28.130 に答える