在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
我应该如何从班级更新画布?
答案 0 :(得分:0)
使用CompositionTarget.Rendering
事件更新Canvas
控件。每次WPF渲染帧时都会触发此事件。这是一种在循环中更新UI的更传统的方法。
CompositionTarget.Rendering += DoUpdates;
private void DoUpdates(object sender, EventArgs e)
{
// Update canvas
}