1

wp 7.x/8 用のアプリを作成しています。

のような機能があります -

public void draw()
{
    .............
    ImageBrush imgbrush = new ImageBrush();
    imgbrush.ImageSource = new BitmapImage(...);

    rect.Fill = imgbrush;  //rect is of type Rectangle that has been created 
                           //and added to the canvas
    ........
}

そして別の機能

private void clicked(object sender, RoutedEventArgs e)
{
    draw();
    ........
    if (flag)
    {
          Thread.sleep(5000);
          draw();
    }
}

ただし、ボタンをクリックすると、両方の描画操作の結果が画面に同時に表示されます。

2 回目の draw() 操作の結果を少し遅れて表示するにはどうすればよいですか?

または、画面のバッファのようなものがありますか?バッファがいっぱいになるまで、画面は更新されませんか?

その場合、画面を明示的に FLUSH または Refresh する方法、または Rectangle の .fill() メソッドを強制して画面に変更を加える方法は?

この点で何か助けていただければ幸いです。

4

2 に答える 2

1

pantaloons が言うように、すべてのアクション (最初の描画、スリープ、および 2 番目の描画) は同じスレッド上にあるため、UI 自体が更新される機会はありません。ただし、わずかに優れた実装があります (ただし、前述の提案と同じ原理に従います)。

タイマーを使用すると、次のように、別のスレッドを待機させて、UI を最初の描画から更新してから 2 番目の描画を行うことができます。

private void clicked(object sender, RoutedEventArgs e)
{
    draw();
    ........
    if (flag)
    {
        var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) };

        timer.Tick += (sender, args) => { timer.Stop(); draw(); };

        timer.Start();
    }
}

このソリューションでは、すべての呼び出しが DispatcherTimer (UI スレッドに自動的にコールバックされます) によって処理されます。また、draw を連続して 2 回以上呼び出す必要がある場合、タイマーは停止するまで動作し続けるため、カウントを含めるように拡張するのは非常に簡単です。

于 2013-03-03T14:01:40.130 に答える
0

問題は、スリープによって UI スレッドをブロックしているため、変更が同期的に発生するその関数が戻るまで、描画メッセージがポンプされないことです。ハッキーな解決策は次のようなものですが、実際にはアプリの設計を変更して async/await パターンを使用する必要があります。

private void clicked(object sender, RoutedEventArgs e)
{
    draw();
    if (flag)
    {
        System.Threading.Tasks.Task.Run(() =>
        {
            System.Threading.Thread.Sleep(5000);
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                draw();
            });
        });
    }
}
于 2013-03-02T23:39:41.403 に答える