1

我正在使用 WPF 和 C# 制作应用程序。我想做的是在我按下按钮时在画布上打印很多形状,中间有一段时间。在我按下按钮的那一刻,一切都立即弹出。我试图在每次“打印”之间让线程休眠一段时间,但这无济于事,只是需要更长的时间才能让所有东西立即飞溅。我想要实现的是形状一次弹出一个,让我们说之间有 0.5 秒。代码如下:

   private void Create_Click(object sender, RoutedEventArgs e)
   {
        Random random = new Random();
        for (int i = 0; i < 50; i++)
        {
            Thread.Sleep(500);
            Path f = FlowerFactory.createFlower(FlowerBP, true);
            Canvas.SetLeft(f, random.Next(0, 1650));
            Canvas.SetTop(f, random.Next(0,1000));
            DrawBoard.Children.Add(f);
        }}
4

3 回答 3

3

首先,您需要在后台线程中运行循环,这样它就不会阻止 UI 更新;其次,将 UI 渲染任务发送回 UI 线程。第一个,你可以使用Task.Factory.StartNew,第二个,使用Dispatcher.Invoke

Random random = new Random();
Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 50; i++)
    {
        Thread.Sleep(500);
        Dispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
        {
            Path f = FlowerFactory.createFlower(FlowerBP, true);
            Canvas.SetLeft(f, random.Next(0, 1650));
            Canvas.SetTop(f, random.Next(0,1000));
            DrawBoard.Children.Add(f);
        }));
    }
});
于 2012-11-23T18:44:14.540 回答
1

让负责 GUI 的主线程休眠是一个糟糕的决定。

尝试使用DispatchTimer。例如:

DispatcherTimer m_dispatcherTimer = new DispatcherTimer();
int m_count = 50;

private void Init()
{
    m_dispatcherTimer.Tick += new EventHandler(OnTick);
    m_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
}

private void Create_Click(object sender, RoutedEventArgs e)
{
    m_count = 50;
    m_dispatcherTimer.Start();
}

private void OnTick(object sender, EventArgs e)
{
    // Draw your shapes here

    if(0>=--m_count)
    {
        m_dispatcherTimer.Stop();
    }
}
于 2012-11-23T18:48:23.513 回答
0
using System.Reactive.Concurrency;
using System.Reactive.Linq;
...
var subscription = Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(50).Subscribe(x=>CreateRandomFlower);
于 2012-11-23T18:51:05.393 回答