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

rekjcdws  于 2023-03-24  发布在  C#
关注(0)|答案(4)|浏览(139)

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

zz2j4svz

zz2j4svz1#

这不是你想要的答案,而是:你不应该在游戏中使用WPF。坚持使用Forms(它不会被MS抛弃,因为WPF不会取代Forms),或者如果你想进入下一个层次,试试XNA。

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

事情是这样的:
WPF的目标是简化富UI开发。首先,MS理解Forms的编码方式混合了 * 行为 * 和 * 表示 *。这对应用程序设计和可维护性都很糟糕。此外,在Forms中,所有内容都必须编码;库本身对用户的作用很小,例如,如果你想让一个按钮有不同的外观,你必须重写它的Draw方法,然后以某种方式绘制代表它的任何图形。
在WPF中,行为与表现是分开的。例如,什么是按钮?在Windows中,我们知道它是一个圆角框,但是看看周围……你的鼠标滚动也是一个按钮,尽管它看起来一点也不像Windows的默认按钮。作为一个按钮意味着有特定的行为使用WPF,这非常简单。您定义一个按钮,然后使用,比如说,一个图像或文本,将其呈现给用户。
当然,这一切都是有代价的;例如,WPF比Forms慢。游戏需要快速,尽量不要浪费资源。在游戏中,每个行为都倾向于编码(当然不是UI),每个演示都是定制的(2D图形或3D对象),所以无论如何你都必须做大量的编码。所以你使用了一种昂贵的技术,但却放弃了它的大部分好处。
但我不是Maven。你可以查看this博客,其中一位前微软员工尝试了近两年,将WPF用于游戏。他总结道:
你可能已经注意到博客已经有一段时间没有更新了。WPF的性能似乎不适合严肃的游戏,我已经认输了,将使用XNA开发游戏。我只是不认为值得与WPF框架作斗争。
从那里我得出了我的大部分结论。

0mkxixxg

0mkxixxg3#

有几个容器来显示东西。你想用的那个是画布(唯一一个有坐标系的)some more details
关键是你要玩什么样的游戏,使用xaml可以是一些基本的类应用程序游戏(基本的绘图等等)。如果需要更多的东西,可以考虑使用XNA。xaml的优点是它很容易通过处理程序与用户交互,例如,在屏幕上写一个字符串很简单,这对XNA来说有点难。使用xmal u也可以为IE制作一个游戏(XABP)、Windows Phone和Silverlight。
你所做的形式是一个有点循环风格的游戏。
String getString();
这更适合XNA。但是如果你想使用WPF和XAML,请使用Canvans和LayoutUpdate处理程序。

pnwntuvh

pnwntuvh4#

您可以尝试使用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);
    }

相关问题