- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 C# WinForms 中,每当在这里或那里制作小游戏时,我都会编写一个快速类,它是 System.Windows.Forms.Panel 的子类,并在构造函数中将 DoubleBuffered 设置为 true。然后您可以覆盖 OnPaint 方法来显示游戏元素。我已经这样做了 2 或 3 年了,但我真的很想拥抱 WPF 和 XAML,我真的很喜欢它用于常规应用程序布局。在 WPF 中这样做有什么等价物?
最佳答案
不是您寻求的答案,而是:您不应该将 WPF 用于游戏。坚持使用 Forms(它不会被 MS 抛弃,因为 WPF 没有取代 Forms)或者如果您想进入下一个级别,请尝试 XNA。
更新:昨天我回答的很快,因为我很着急而且因为我也是为了做游戏而研究WPF,所以我没有'我不想在没有正确答案的情况下离开 OP。
这是交易:
WPF 的目标是简化丰富的 UI 开发。首先,MS 理解 Forms 的编码方式混合了行为和表示。这对应用程序设计和可维护性来说都是不好的。此外,在 Forms 中,所有内容都必须进行编码;图书馆本身对用户的作用很小。例如,如果您想要一个具有不同外观的按钮,则必须覆盖其 Draw
方法,然后以某种方式绘制代表它的任何图形。
使用 WPF,行为 与表示 是分开的。例如,什么是按钮?在 Windows 中,我们知道它是一个带有圆角的框,但环顾四周……您的鼠标滚动也是一个按钮,尽管它看起来与 Windows 默认按钮完全不同。作为一个按钮意味着具有特定的行为(主要是点击),而不是看起来像一个盒子。使用 WPF,这非常简单。您定义一个按钮,然后使用图像或文本等将其呈现给用户。
当然,所有这些都是有代价的;例如,WPF 比 Forms 慢。游戏需要快速,尽量不要浪费资源。在游戏中,每个行为都倾向于被编码(当然不是 UI),每个演示都是定制的(2D 图形或 3D 对象),因此您无论如何都必须进行大量编码。因此,您正在使用一项昂贵的技术,但却放弃了它的大部分优势。
但我不是专家。你可以查看this博客,其中一名前 Microsoft 员工尝试将 WPF 用于游戏近两年。他总结道:
You've probably noticed that the blog hasn't been updated in a while. WPF performance just doesn't seem to be there for serious games, and I've thrown in the towel and will work on games using XNA. I just don't think it's worth fighting the WPF framework...
从那里我得出了大部分结论。
关于C# WPF OnPaint 方法替代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340213/
我想知道在windows窗体程序中覆盖OnPaint时应该什么时候调用base.OnPaint? 我正在做的是: private void Form1_Paint(object sender, P
我有一个包含用户控件的 Windows 窗体。此用户控件具有以下代码: protected override void OnPaint(PaintEventArgs pe) { base.OnPa
我有一个包含用户控件的 Windows 窗体。此用户控件具有以下代码: protected override void OnPaint(PaintEventArgs pe) { base.OnPa
我正在尝试使用 FillPath 覆盖我自己的自定义控件中标签的 OnPaint 方法。 这是我的控件代码: public partial class GlassLabel : Label {
如果我重写 OnPaint 并在控件上绘制一个正方形,当我在设计器中预览它时,如何让 e.graphics.draw... 显示出来? 最佳答案 http://msdn.microsoft.com/e
我正在创建一个带有自定义边框的表单。我想使用 onPaint 重写来绘制自己的边框。不幸的是,当我只使用下面的代码时,我得到了图像的踪迹。 有人知道怎么解决吗?是的,我已将 DoubleBuffere
我在对话框中有一个图片控制框(CStatic)。当用户按下对话框中的按钮时,我需要 onPaint() 在其中绘制图像。问题是,图像是在对话框加载时绘制的。如何防止这种情况并仅在按下按钮时调用它。 我
我对 CFrameWnd 的 OnPaint 方法有问题,我似乎无法弄清楚发生了什么。 OnPaint 大约每 10 毫秒调用一次,这会导致计算机死机。检查 CPU 使用率,此应用占用 50%! 该应
我有一个 CWind 类的 child ,我在其中订阅 OnPaint 事件: BEGIN_MESSAGE_MAP(MyListBox, CWnd) ON_WM_PAINT() END_MES
我有一个 CWind 类的 child ,我在其中订阅 OnPaint 事件: BEGIN_MESSAGE_MAP(MyListBox, CWnd) ON_WM_PAINT() END_MES
我们有一个通常在 Windows XP 下运行的 .NET 2.0 软件(在 Windows“经典”模式下配置,没有附加功能)。现在,我在 Windows 7 上运行它的全部功能。我在 Windows
我正在尝试使命令模式适应具有撤消功能的简单绘图应用程序。我一直坚持使用 OnPaint 撤消操作事件。这是代码: [已解决] 帖子末尾的详细信息 interface ICommand { vo
大家好,我在编写自定义控件时遇到了问题。我的控件继承自 Windows.Forms.Control,我试图重写 OnPaint 方法。这个问题有点奇怪,因为只有当我在我的表单中包含一个控件时它才有效,
我有一个自定义绘画的用户控件。据我所知,构造函数正确设置样式。基本代码: public partial class LineChart2 : UserControl { public Line
我有以下自定义 Control: public class Line : Control { protected override void OnPaint(PaintEventArgs e)
我有一个 UserControl(WinForms,.net 2.0),我有这个: protected override void OnPaint(PaintEventArgs e) { ba
我正在尝试使用 winforms 和 gdi+ 实现一些动画,但我在控件中发现了很多撕裂的移动 Sprite 。 在托管 .net 中有没有办法让重写的 Control.OnPaint 方法等待监视器
在 WinForm 应用程序中,当订阅 OnPaint() 事件时,PaintEventArgs 提供一个 ClipRectangle 属性定义要绘制的区域。 当表单垂直或水平调整大小时,它会给出要绘
我有以下wx.Window: class SketchWindow(wx.Window): def __init__(self, parent): wx.Window.__init__(s
我有一个用 C++ 和 MFC 编写的基于对话框的应用程序。该对话框有一个 CStatic 图片控件。我在 PictureCtrl 的 OnPaint() 函数中绘制 BITMAP。相关代码如下: v
我是一名优秀的程序员,十分优秀!