5

私はWPFを初めて使用します。私はC#とASP.NETのバックグラウンドを持っています。

インタラクティブなBeginoverload.Begin(this、true)を介してプログラムで開始される、2つのストーリーボードを使用して非常に基本的なWPFアプリケーションを作成しようとしています。

OnCompletedイベントが発生すると、他のストーリーボードのステータスがチェックされます。ストーリーボードが実行されていないというステータスの場合は、ストーリーボードを開始する必要があります。

Completedハンドラーで次のエラーが発生します。

スロー:指定されたストーリーボードがインタラクティブ制御のためにこのオブジェクトに適用されなかったため、アクションを実行できません。

インタラクティブな制御に正しい.Begin(this、true)オーバーロードを使用したと思います。

以下にMainWindow.csとMainWindow.xamlのコードを含めました。Xamlのトリガーを使用してアニメーションを意図的に開始しているわけではありません。アニメーションを動的に開始し、他の複数のアニメーションの状態を確認する必要があります。主な問題に焦点を当てるために例を取り除いた。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
 using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace StoryboardExample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public Storyboard Storyboard1 { get; set; }
    public Storyboard Storyboard2 { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        Storyboard1 = (System.Windows.Media.Animation.Storyboard)FindResource("Storyboard1");
        Storyboard1.Name = "MegatronStoryboard";
        Storyboard1.Completed +=new EventHandler(Storyboard1_Completed);

        Storyboard2 = (System.Windows.Media.Animation.Storyboard)FindResource("Storyboard2");
        Storyboard2.Name = "TransformerStoryboard";
        Storyboard2.Completed += new EventHandler(Storyboard2_Completed);

        Storyboard2.Begin(this, true);
    }

    void Storyboard1_Completed(object sender, EventArgs e)
    {
        if (Storyboard2.GetCurrentState() == ClockState.Stopped)
        {
            Storyboard2.Begin(this, true);
            //Throws: Cannot perform action because the specified Storyboard was not applied to this object for interactive control.

            //I thought I was calling the Begin overload with the correct params for interactive control
            //I thought I was calling the Begin overload with the correct params for interactive control .Begin(this,true)
        }
    }

    void Storyboard2_Completed(object sender, EventArgs e)
    {
        if (Storyboard1.GetCurrentState() == ClockState.Stopped)
        {
            Storyboard1.Begin(this, true);
            //Throws: Cannot perform action because the specified Storyboard was not applied to this object for interactive control.

            //I thought I was calling the Begin overload with the correct params for interactive control .Begin(this,true)
        }
    }


}
}

<Window x:Name="MainWindow1" x:Class="StoryboardExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Storyboard x:Key="Storyboard1">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="cnvsStoryboard1">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="cnvsStoryboard1">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="0.2"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="cnvsStoryboard1">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="0.2"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="cnvsStoryboard1">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="26"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="26"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="18"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="cnvsStoryboard1">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="353"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="353"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="5"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="Storyboard2">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="cnvsStoryboard2">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="cnvsStoryboard2">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="0.2"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="cnvsStoryboard2">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.2"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="0.2"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="cnvsStoryboard2">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-230"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="-230"/>
            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="137"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="cnvsStoryboard2">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-10"/>
            <EasingDoubleKeyFrame KeyTime="0:0:3" Value="-10"/>
            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="-13"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>

<Canvas x:Name="LayoutRoot">
    <Canvas x:Name="cnvsStoryboard1" 
            Height="203" Canvas.Left="223" 
            Canvas.Top="-284" Width="253" 
            Opacity="0" 
            RenderTransformOrigin="0.5,0.5">
        <Canvas.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleX="0.2" ScaleY="0.2"/>
                <SkewTransform/>
                <RotateTransform/>
                <TranslateTransform/>
            </TransformGroup>
        </Canvas.RenderTransform>
        <Image x:Name="imgTransformer" Height="148" 
               Canvas.Left="42" Source="Images/transformer.png" 
               Stretch="Fill" Canvas.Top="8" Width="176" 
               RenderTransformOrigin="0.5,0.5">
            <Image.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform X="1" Y="1"/>
                </TransformGroup>
            </Image.RenderTransform>
        </Image>
        <Label x:Name="lblTank" Content="Tank" Canvas.Left="101" Canvas.Top="160" FontSize="21.333">
            <Label.Foreground>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black"/>
                    <GradientStop Color="#FFCA2828" Offset="1"/>
                    <GradientStop Color="#FE412424" Offset="0.003"/>
                </LinearGradientBrush>
            </Label.Foreground>
        </Label>
    </Canvas>
    <Canvas x:Name="cnvsStoryboard2" Height="318" 
            Canvas.Left="41" Canvas.Top="229" 
            Width="215" Opacity="0" 
            RenderTransformOrigin="0.5,0.5">
        <Canvas.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleX="0.2" ScaleY="0.2"/>
                <SkewTransform/>
                <RotateTransform/>
                <TranslateTransform/>
            </TransformGroup>
        </Canvas.RenderTransform>
        <Image x:Name="imgMegatron" Height="264" Canvas.Left="33" 
               Source="Images/Megatron.png" 
               Stretch="Fill" Canvas.Top="8" 
               Width="153"/>
        <Label x:Name="lblMegatron" 
               Content="Megatron" 
               Canvas.Left="56" 
               Canvas.Top="278" 
               FontSize="21.333" 
               Width="107.707" 
               RenderTransformOrigin="0.696,0.599" Height="40">
            <Label.Foreground>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black"/>
                    <GradientStop Color="#FFCA2828" Offset="1"/>
                    <GradientStop Color="#FE412424" Offset="0.003"/>
                </LinearGradientBrush>
            </Label.Foreground>
        </Label>
    </Canvas>
</Canvas>
</Window>

私はこれを調べていて、ストーリーボードの最初のパラメーターだと思います。Begin(this、true)オーバーロードが正しくない可能性がありますか?

どんな助けでも大歓迎です。

-アーロン

4

2 に答える 2

7

.GetCurrentState(this) を使用すると機能しますか? または、おそらく .Stop(this); を呼び出します。.Start(this, true)? を呼び出す直前に?

于 2013-01-23T06:21:32.973 に答える
0

また、ストーリーボードが制御可能であることを確認してください。MSDN から:「ストーリーボードをコードで制御可能にするには、ストーリーボードの Begin メソッドの適切なオーバーロードを使用し、true を指定して制御可能にする必要があります。」

詳細: http://msdn.microsoft.com/en-us/library/cc672521.aspx

于 2015-08-10T13:52:42.687 に答える