5

私はあちこち検索しましたが、これに関する答えが見つからないようです。私のアプリは緩やかな XAML の世界にあるため、要素を見つけるために XamlReaders とツリー ウォーキングに依存する必要があります。これらの XAML ページのレンダリングを処理するコンポーネントがあります。そのレンダラーは、読み込まれた XAML で実行されている可能性のあるストーリーボードの状態を知る必要があります。したがって、レンダラーでやりたいことは次のようなものです: -

var resources = _currentScreenFrameworkElement.Resources;
foreach (var item in resources.Values)
{
    if (item is Storyboard)
    {
        try
        {
            var storyboard = item as Storyboard;
            **if (storyboard.GetCurrentState() == ClockState.Active)**

すべて順調です。ただし、問題は、CurrentState を dcheck しようとすると、例外がスローされることです。

"Cannot perform action because the specified Storyboard was not applied to this object for interactive control."

周りを見回すと、ストーリーボードを制御可能にする必要があるためです。私の質問は、XAML でこれを行うにはどうすればよいですか? コードでストーリーボードを開始しないので、オーバーロードされた BeginStoryboard に true を渡すことができません。

4

1 に答える 1

5

この同じ問題に遭遇したので、調査結果を共有したいと思いました。

ストーリーボードが Controllable としてマークされていない場合、そのエラーが発生します。Begin メソッドが呼び出されると、ストーリーボードは制御可能としてマークされます。

コード ビハインドから実行している場合は、このIsControllableブール値の引数 ( Begin オーバーロードのリスト) を持つオーバーロードを使用するだけです。

Xaml で BeginAnimation 要素を使用した場合は、2 つのことを行う必要があります。

  1. aNameを BeginAnimation 要素に割り当てます。このプロパティのドキュメントには次のように記載されています
  2. コードビハインドでストーリーボードを操作しようとしている場合は、BeginStoryboard が宣言されたオブジェクトへの参照を渡す必要があります。

ステップ 1 を示す例を次に示します (beginstoryboard に名前を付けます)。

<Button Name="btn1" Content="bla">
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Click">
      <BeginStoryboard 
             Name="bnt1_beginStoryboard" 
             Storyboard={StaticResource someSharedStoryboard}"/>
    </EventTrigger>
  </Button.Triggers>
</Button>

これがステップ 2 の例です。beginStoryboard に名前を付けたので、それをクラスのローカル変数として使用できます。または、実際のストーリーボードを直接参照することもできます。要点は、beginStoryboard (この場合はボタン) の所有者を渡す必要があるということです。

//The main point here is that we're passing in btn1
bnt1_beginStoryboard.Storyboard.Stop(btn1);
bnt1_beginStoryboard.Storyboard.SkipToFill(btn1);
bnt1_beginStoryboard.Storyboard.Resume(btn1);

所有するフレームワーク要素を渡す必要があるストーリーボードのすべての「アクション」メソッドのリストを次に示します: 開始後にストーリーボードを制御する

于 2012-11-21T19:49:24.217 に答える