C#WPF OnPaint方法替代?

时间:2010-07-27 01:42:12

标签: c# wpf

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

4 个答案:

答案 0 :(得分:4)

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


更新:我昨天很快就回答了这个问题,因为我很匆忙,因为我还调查了WPF才能做游戏,所以我没有'我想在没有正确答案的情况下离开OP。

这是交易:

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

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

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

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

  

你可能已经注意到了博客   暂时没有更新。 WPF   表现似乎不是   那里有严肃的比赛,而且我已经   扔在毛巾上,将继续努力   使用XNA的游戏。我只是不思考   它值得与WPF作战   框架...

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

答案 1 :(得分:2)

UIElement.OnRender

谨慎使用; it's not as efficient

这是一种范式转换。

答案 2 :(得分:1)

有一些容器可以显示内容。您想要使用的是Canvas(唯一具有坐标系的人)some more details

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

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

更新();  漆();

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

答案 3 :(得分:0)

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