C# WPF OnPaint 方法的替代方案?

Posted

技术标签:

【中文标题】C# WPF OnPaint 方法的替代方案?【英文标题】:C# WPF OnPaint method alternative? 【发布时间】:2010-07-27 01:42:11 【问题描述】:

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

【问题讨论】:

【参考方案1】:

不是您寻求的答案,而是:您不应该将 WPF 用于游戏。坚持使用 Forms(它不会被 MS 抛弃,因为 WPF 不会取代 Forms)或者如果您想更上一层楼,请尝试 XNA。


更新:我昨天回答的很快,因为我很着急并且因为我也为了做游戏而研究了 WPF,所以我没有'不想在没有正确答案的情况下离开 OP。

这里是交易:

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

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

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

但我不是专家。您可以查看this 博客,其中一位前微软员工在近两年的时间里尝试将 WPF 用于游戏。他总结道:

您可能已经注意到博客 有一段时间没有更新了。 WPF 性能似乎不是 在那里玩严肃的游戏,我已经 认输并将继续工作 使用 XNA 的游戏。我只是不认为 值得与 WPF 抗争 框架...

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

【讨论】:

我不想将技术强加到项目中。如果 WPF 不是一个合适的选择,我可以接受。 为什么 Forms 比 WPF 更适合游戏? 另一位博主显然将 WPF 与 XNA/DirectX 进行比较,而不是与 Forms 进行比较。 WPF 和 Forms 都不适用于“严肃”游戏,但我不认为 Forms 比 WPF 慢。 Forms 不提供任何硬件加速,而且,如果你想做任何类型的特殊渲染,无论如何你都要在 CPU 上绘制你自己的像素。除非您要处理数千个屏幕上的对象(如果您使用画笔则不必这样做),WPF 通常更快。此外,WPF 为几乎所有内容提供着色器和基础硬件加速 - 平铺、调整大小等等。 -1。 WPF is slower than Forms - 你不知道你在说什么。 “坚持形式”是最不明智的建议。您也可以告诉 OP “坚持”使用 100 年前的 COBOL 或任何其他恐龙技术。 @BrunoBrant 更不用说你的回答并没有真正回答 OP 关于如何在 WPF 中“绘制”的问题,这是通过简单地将一些 XAML 放在一起来实现的(而不是可怕的程序代码黑客)你需要在winforms中做任何事情)。【参考方案2】:

UIElement.OnRender.

谨慎使用; it's not as efficient.

这是一种范式转变。

【讨论】:

【参考方案3】:

有一些容器可以用来展示东西。您想要使用的是 Canvas(唯一具有坐标系的)some more details

关键是你要玩什么样的游戏。使用 xaml 它可能是一些基本的类似应用程序的游戏(基本绘图等)。如需更多信息,请考虑使用 XNA。 xaml 的优点是它很容易通过处理程序与用户交互,f.e 将字符串写入屏幕很简单,这对 XNA 来说有点困难。还可以使用 xmal 为 IE (XABP)、Windows Phone 和 Silverlight 制作游戏。

你用表单做的有点像循环式游戏。

更新(); 油漆();

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

【讨论】:

【参考方案4】:

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

//WPF XAML
<WindowsFormsHost x:Name="formsHost" HorizontalAlignment="Left" Visibility="Visible" Grid.Column="0" Grid.Row="0"></WindowsFormsHost>


//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);
    

【讨论】:

以上是关于C# WPF OnPaint 方法的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform Graphics 画图问题?

C# (winform)如何改变控件形状

WPF中TreeView.BringIntoView方法的替代方案

WPF - PathListBoxUtils 和程序集或替代方案

.NET(C#) SendKeys模拟键盘按键不生效使用WinAPI的替代方案

C# 中 HttpListener 和 Griffin.WebServer 的替代方案