C# WPF OnPaint 方法的替代方案是什么?

6

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

4个回答

4

4
不是你想要的答案,但是:你不应该使用WPF来制作游戏。如果你想进入下一个级别,请使用Forms(因为WPF并没有取代Forms,所以它不会被MS抛弃)或尝试XNA。


更新:昨天我很匆忙地回答了这个问题,因为我也研究了一下WPF来制作游戏,所以我不想让提问者没有得到正确的答案。

事实如下:

WPF的目标是简化丰富UI的开发。首先,微软认识到Forms编码方式混合了行为演示。这是不好的,既对应用程序设计又对可维护性都有影响。此外,在Forms中,每个东西都必须编码;库本身为用户做的很少。例如,如果你想要一个外观不同的按钮,你必须重写它的Draw方法,然后以某种方式绘制代表它的任何图形。

使用WPF,行为演示分离。例如,什么是按钮?在Windows中,我们知道它是一个带有圆角的框,但是看看周围...你的鼠标滚轮也是一个按钮,尽管它看起来与Windows默认按钮完全不同。成为按钮意味着具有特定的行为(主要是点击),而不是看起来像一个框。使用WPF,这非常简单。您定义一个按钮,然后使用图像或文本来呈现给用户。

当然,所有这些都是有代价的;例如,WPF比Forms慢。游戏需要快速运行并尽量不浪费资源。在游戏中,每个行为往往都是编码的(当然不包括UI),每个演示都是定制的(2D图形或3D对象),因此您仍然需要进行大量编码。因此,您正在使用一种昂贵的技术,但却抛弃了其大部分优点。

但我不是专家。您可以查看此处的博客,其中一位前微软员工尝试了近两年时间使用WPF来制作游戏。他得出结论:

您可能已经注意到,该博客已经有一段时间没有更新了。 WPF性能似乎无法胜任严肃的游戏,所以我放弃了,将使用XNA制作游戏。我认为这不值得为了WPF框架而奋斗...

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


2
我不想将一种技术强加于该项目上。如果WPF并不是一个适当的替代方案,我也可以接受。 - Corey Ogburn
2
另一位博主显然是在将WPF与XNA / DirectX进行比较,而不是与Forms进行比较。无论是WPF还是Forms都不适用于“严肃”的游戏,但我不认为Forms比WPF慢。Forms不提供任何硬件加速,并且如果您想进行任何特殊渲染,您将不得不在CPU上绘制自己的像素。除非您正在处理数千个屏幕对象(如果使用画笔,则不应该这样做),否则WPF通常更快。此外,WPF为几乎所有内容提供着色器和从头开始的硬件加速-平铺,调整大小等等。 - Rei Miyasaka
10
“WPF比Windows Forms慢” - 你并不知道自己在说什么,“还是用Windows Forms”的建议是最愚蠢的。这就好像让那些坚持使用100年前恐龙技术COBOL的人一样。 - Federico Berasategui
2
@BrunoBrant жӣҙдёҚз”ЁиҜҙдҪ зҡ„еӣһзӯ”并没жңүзңҹжӯЈеӣһзӯ”OPе…ідәҺеҰӮдҪ•еңЁWPFдёӯвҖңз»ҳеӣҫвҖқзҡ„й—®йўҳпјҢиҝҷеҸҜд»ҘйҖҡиҝҮз®ҖеҚ•ең°з»„еҗҲдёҖдәӣXAMLжқҘе®һзҺ°пјҲдёҺWinformsдёӯйңҖиҰҒдҪҝз”ЁеҸҜжҖ•зҡ„иҝҮзЁӢејҸд»Јз Ғй»‘е®ўзӣёжҜ”пјүгҖӮ - Federico Berasategui
1
仍然因为我六年前给出的答案而受到指责。@MickyD 是的,你说得对,那个答案很糟糕。但是SO不允许我删除它。 - Bruno Brant
显示剩余10条评论

0

您可以尝试使用WinForms宿主在WPF中添加Windows Forms自定义控件,并使用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);
    }

0

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

关键在于你想要制作什么样的游戏。使用XAML,可以制作一些基本的应用程序式游戏(基本绘图等)。如果需要更多功能,考虑使用XNA。 XAML的优点是易于通过处理程序与用户交互,例如,可以轻松地将字符串写入屏幕上,这对于XNA来说有点困难。此外,使用XAML,您可以为IE(XABP),Windows Phone和Silverlight制作游戏。

你之前做的那个表单有点像循环式游戏。

Update(); Paint();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接