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();
    }
}

但是当按钮被点击时,两个绘制操作的结果同时出现在屏幕上。

如何使第二次 draw() 操作的结果在延迟后出现?

或者是否有类似屏幕缓冲区的东西,直到缓冲区没有填满屏幕才会刷新?

在这种情况下,如何显式刷新或刷新屏幕或强制 Rectangle 的 .fill() 方法在屏幕上进行更改?

在这方面的任何帮助将不胜感激。

4

2 回答 2

1

正如 pantaloons 所说,由于您的所有操作都在同一个线程上(第一次绘制、睡眠和第二次绘制),因此 UI 本身永远没有机会更新。但是,有一个更好的实现(尽管它遵循与上述建议相同的原则)。

通过使用计时器,您可以让它等待另一个线程,允许 UI 在执行第二次绘制之前从第一次绘制更新​​,如下所示:

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 需要连续调用两次以上,计时器将继续计时直到停止,因此扩展以包含计数将非常简单。

于 2013-03-03T14:01:40.130 回答
0

问题是您通过休眠阻塞了 UI 线程,因此在该函数返回之前永远不会抽取绘制消息,其中更改同步发生。一个 hacky 解决方案将类似于以下内容,但实际上您应该更改您的应用程序设计以使用 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 回答