1

その名前で生成されたストーリーボードを見つけるのに問題があります。このコードは複数回呼び出され、戻り値が非同期であるため、クラス変数を使用できません。

詳細については、私の他の質問を参照してください

私のコード:

private void refreshPostIt(int index)
    {
        Button btn = // Button to rotate
        Storyboard sb = new Storyboard();
        sb.Name = "sb" + postItIndex;

        Storyboard.SetTarget(rotate, btn);
        Storyboard.SetTargetName(rotate, btn.Name);
        Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)"));
        sb.Children.Add(rotate);
        sb.Begin(btn, true);

        // Asynchronous call
        BackgroundWorker bgw = new BackgroundWorker();
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        bgw.RunWorkerAsync(postItIndex);
    }
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        int postItIndex = // Retrieved from e.Arguments
        Button btn = // Find the Button thanks to the postItIndex

        Storyboard sb = // Here is my problem, how to find the Storyboard
        if (sb != null)
        {
            // Stop rotation
            //sb.Stop(btn);
        }
    }
4

2 に答える 2

1

MVVM を使用して「postIt」を表示する場合、ストーリーボードの開始と停止は完全に XAML になります。

Post を表す UIItem dataTemplate に次の疑似スタイルがあります。

<Style>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsRefreshing}"
                     Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard x:Name="rotating">
                    <Storyboard>
                        <DoubleAnimation... />
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <StopStoryboard BeginStoryboardName="rotating" />
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

あなたのビューモデルは(疑似コード)のようなものでなければなりません:

Class MyApp : INotifyPropertyChanged
  ObservableCollection<Post> Posts {get;set;}
  void RefreshPost(int id);

Class Post : INotifyPropertyChanged
  bool IsRefreshing {get;set;}

ウィンドウには、Post の ItemTemplate を含む listBox があり、ItemsSource に Posts コレクションを指定します。

そして、MyApp のインスタンスに設定されたウィンドウのデータコンテキスト。したがって、投稿の IsRrefreshing を変更するたびに、残りは UI によって処理されます。

于 2012-06-01T10:21:29.813 に答える
1

BackgroundWorker から継承するクラスを常に作成できますが、シールされていません。完了したイベントに渡したい情報を含むプロパティをそのクラスに追加します。

    class StoryboardWorkerArgs
    {
        public Storyboard StoryBoard { get; set; }
        public object Other { get; set; }
    }

    class BackgroundWorker2 : BackgroundWorker
    {
        public StoryboardWorkerArgs Args { get; set; }
    }

その後、args プロパティでストーリーボードを設定できます。

BackgroundWorker2 worker = new BackgroundWorker2();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.Args = new StoryboardWorkerArgs ()
{
  StoryBoard = null, /* reference to your storyboard*/
  Other = null, /* postItIndex */
 };
 worker.RunWorkerAsync();

次に、完了したイベントで。

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    BackgroundWorker2 sender2 = sender as BackgroundWorker2;
    if (sender2 != null)
    {
        var story = sender2.Args.StoryBoard; // <- your storyboard.
    }
}
于 2012-06-01T09:39:20.317 に答える