c#在while循环中更新canvas

时间:2015-09-03 19:18:44

标签: c# wpf canvas

在wpf应用程序中有一个画布,我将其传递给我的Game类。在我的游戏类中,我想每0.02秒更新一次画布。目前我的代码正在运行,但感觉“hacky”,我的代码:

public void Start()
{

    bw = new BackgroundWorker();
    bw.DoWork += bw_DoWork;
    bw.ProgressChanged += bw_ProgressChanged;
    bw.WorkerReportsProgress = true;
    bw.RunWorkerAsync();
}

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    GameRender();
}

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    while (Running)
    {
        GameUpdate();
        //GameRender();
        bw.ReportProgress(1);        
        //repaint();   
        try
        {
            Thread.Sleep(10);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex + "");
        }
    }
}

因为它对我来说似乎是一个黑客,我尝试使用类似的线程;

    public void Start()
    {

        new Thread(() =>
        {
            while (true)
            {
                GameUpdate();
                GameRender();
            }
        }).Start();
    }

但这在我的GameRender()中崩溃,我尝试更新我的画布。错误:

An unhandled exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll

我应该如何从班级更新画布?

1 个答案:

答案 0 :(得分:0)

使用CompositionTarget.Rendering事件更新Canvas控件。每次WPF渲染帧时都会触发此事件。这是一种在循环中更新UI的更传统的方法。

CompositionTarget.Rendering += DoUpdates;

private void DoUpdates(object sender, EventArgs e)
{
    // Update canvas
}