代码之家  ›  专栏  ›  技术社区  ›  Corey Ogburn

C WPF油漆方法替代品?

  •  7
  • Corey Ogburn  · 技术社区  · 14 年前

    在C winforms中,每当在这里或那里制作一个小游戏时,我都会编写一个快速类,它是system.windows.forms.panel的子类,并在构造函数中将doubleBuffered设置为true。然后可以重写onpaint方法来显示游戏元素。我已经做了2到3年了,但是我真的在尝试使用WPF和XAML,我真的很喜欢它用于常规的应用程序布局。在WPF中,有什么等价物可以做到这一点?

    4 回复  |  直到 8 年前
        1
  •  4
  •   Bruno Brant    14 年前

    不是你想要的答案,而是:你不应该在游戏中使用WPF。坚持使用表单(这不会被MS丢弃,因为WPF不会取代表单),或者尝试XNA,如果您想进入下一个级别。


    更新: 昨天我很快回答了这个问题,因为我赶时间 因为我也研究了WPF是为了做游戏,所以我不想离开没有正确答案的OP。

    交易如下:

    WPF的目标是简化富UI开发。首先,MS理解编码混合的形式 行为 具有 演示 . 这对应用程序设计和可维护性都是有害的。此外,在表单中,必须对所有内容进行编码;库本身对用户的作用很小。例如,如果需要具有不同外观的按钮,则必须重写其 Draw 方法,然后,不知何故,绘制表示它的任何图形。

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

    当然,所有这些都要付出代价;例如,WPF比表单慢。游戏需要快速,尽量不要浪费资源。在游戏中,每个行为都会被编码(当然不是用户界面),每个表示都是定制的(二维图形或三维对象),所以无论如何,你都需要做大量的编码。所以你用的是 昂贵的 技术,但放弃了它的大部分好处。

    但我不是专家。你可以检查 this 博客,一位前微软员工在近两年的时间里,尝试使用WPF进行游戏。他总结道:

    你可能已经注意到博客 已经有一段时间没有更新了。WPF 表演似乎不是 为了严肃的游戏,我 扔到毛巾里继续工作 使用XNA的游戏。我只是不认为 值得和WPF抗争 框架…

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

        2
  •  2
  •   Rei Miyasaka    14 年前

    UIElement.OnRender .

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

    这是一个模式转变。

        3
  •  1
  •   Lukasz Madon    14 年前

    有几个容器可以放东西。您要使用的是画布(唯一一个带有坐标系的画布) some more details

    关键是你要玩什么样的游戏。使用XAML,它可能是一些基本的应用程序,比如游戏(基本绘图等)。要了解更多信息,请考虑使用XNA。XAML的优点是通过处理程序很容易与用户交互,例如,在屏幕上编写字符串很简单,这对XNA来说有点困难。此外,使用xmal u还可以为IE(xabp)、Windows Phone和Silverlight制作游戏。

    你所做的是一个循环式的游戏。

    UpDebug(); Prand();

    这更适合XNA。但如果要使用WPF和XAML,请使用Canvans和LayoutUpdate处理程序。

        4
  •  0
  •   JAnton    8 年前

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