C#WPF OnPaint方法替代?

在C#WinForms中,无论何时在这里或那里制作一个小游戏,我都会编写一个快速类,它是System.Windows.Forms.Panel的子类,在构造函数中,将DoubleBuffered设置为true。 然后你可以覆盖OnPaint方法来显示游戏元素。 我已经做了2到3年了,但我真的想拥抱WPF和XAML,我非常喜欢它用于常规应用程序布局。 在WPF中这样做有什么相同之处?

不是你寻求的答案,但是:你不应该将WPF用于游戏。 坚持使用表格(不会被MS转储,因为WPF不会取代表格)或者如果你想进入下一个级别,可以试试XNA。


更新:我昨天很快回答了这个问题,因为我很匆忙因为我也考虑过WPF来做游戏,所以我不想在没有正确答案的情况下离开OP。

这是交易:

WPF的目标是简化丰富的UI开发。 首先,MS理解表示编码混合行为的方式表示 。 这对于应用程序设计和可维护性都是不好的。 此外,在表格中,一切都必须编码; 图书馆本身对用户的作用很小。 例如,如果您想要一个具有不同外观的按钮,则必须覆盖其Draw方法,然后以某种方式绘制代表它的任何图形。

使用WPF, 行为演示文稿分离。 例如,什么是按钮? 在Windows中,我们知道它是一个带圆角的盒子,但环顾四周……你的鼠标滚动也是一个按钮,即使它看起来不像Windows默认按钮。 作为一个按钮意味着具有特定的行为(大多数点击),看起来不像一个盒子。 使用WPF,这非常简单。 您可以定义一个按钮,然后使用图像或文本将其呈现给用户。

当然,所有这些都需要付出代价; 例如,WPF比Forms慢。 游戏需要快速,尽量不浪费资源。 在游戏中,每种行为都倾向于编码(当然不是UI),每个演示都是自定义的(2D图形或3D对象),因此您无论如何都必须进行大量编码。 所以你使用的是昂贵的技术,但却丢掉了它的大部分好处。

但我不是专家。 您可以查看此博客, 这位前微软员工近两年来尝试将WPF用于游戏。 他的结论是:

您可能已经注意到该博客暂时没有更新。 WPF的性能似乎并不适用于严肃的游戏,我已经抛弃了,并将使用XNA进行游戏。 我不认为值得与WPF框架作斗争……

从那里我得出了大部分结论。

UIElement.OnRender 。

谨慎使用; 它效率不高 。

这是一种范式转变。

有几个容器可以显示内容。 你想使用的那个是Canvas(唯一一个带坐标系统)的更多细节

关键是你要做什么样的游戏。 使用xaml它可能是一些基本的应用程序类似的游戏(基本图纸等)。 有关更多考虑使用XNA的内容。 xaml的优势在于它很容易通过处理程序与用户交互,因为将字符串写入屏幕很简单,这对XNA来说有点难度。 同样使用xmal你可以为IE(XABP),Windows Phone和Silverlight制作游戏。

你在表单上做的是一些循环风格的游戏。

更新(); 涂料();

这更适合XNA。 但是如果你想使用WPF和Xaml使用Canvans和LayoutUpdate Handler。

您可以尝试使用WinForms主机在WPF中添加Windows窗体自定义控件,并使用OnPaint在那里绘图

 //WPF XAML  //WPF CodeBehind YourCustomWinFormsControls panel = new YourCustomWinFormsControls (); panel.Width = XXX; panel.Height = XXX; formsHost.Child = panel; //WinForms Custome Control Code protected override void OnPaint(PaintEventArgs pe) { //DO STUFF HERE base.OnPaint(pe); }