如何在WPF中绘制窗口(最佳实践)?

时间:2011-04-07 18:46:47

标签: c# .net wpf xaml graphics

我正在尝试编写一个类似于交互式游戏的小应用程序,我需要在屏幕上绘制一个Draw方法,但无法弄清楚如何为WPF构建方法。

如果这是Winforms,我可以使用:

public void Draw (Graphics g)
{

}

但对于WPF Window,我应该在xaml中拥有什么(目前只有Grid),这个Draw方法应该作为参数接收什么?

首先,我想这样做是为了让它工作,然后我可以考虑如何使其更加WPF等等。但现在我更感兴趣的是让它发挥作用。

5 个答案:

答案 0 :(得分:18)

通常,您以完全不同的方式在WPF中“绘制”。

在Windows Forms / GDI中,图形API是立即模式图形API。每次刷新/无效窗口时,都使用Graphics显式绘制内容。

然而,在WPF中,事情的工作方式不同。你很少直接绘制 - 相反,它是一个保留模式图形API。你告诉WPF你想要对象的位置,它会为你处理绘图。

最好的方法是,在Windows窗体中,你会说“从X1到Y1绘制一条线。然后从X2到Y2绘制一条线。然后......”。并且每次需要“重绘”时重复此操作,因为屏幕无效。

在WPF中,你说“我想要一条从X1到Y1的线。我想要一条从X2到Y2的线。” WPF然后决定何时以及如何为你绘制它。

这是通过将形状放在Canvas上,然后让WPF完成所有艰苦工作来完成的。

答案 1 :(得分:8)

如果有太多的对象需要快速绘制(巨大的Visual Tree),另一种选择是使用WriteableBitmap。只需使用Pixels属性设置像素和/或使用Render方法绘制UIElements

答案 2 :(得分:5)

我更喜欢使用像这个例子中的OnRender方法:

protected override void OnRender(DrawingContext drawingContext)
{
    base.OnRender(drawingContext);
     drawingContext.DrawRectangle(null, new Pen(Brushes.Black, 2), new Rect(0, 0, ActualWidth, Height));
}

答案 3 :(得分:2)

要在WPF中实现Draw循环类型行为,您可以使用 CompositionTarget.Rendering 事件。当WPF绘图系统绘制框架时,每帧提升一次。

正如其他人所指出的那样,它不是非常友好的WPF,但它可以用来从WPF应用程序中获得更直接的绘图行为。

在大多数情况下,您将使用单个根画布并更新说明CompositionTarget.Rendering事件中元素的Canvas位置。

例如,要使整个屏幕上的椭圆形飞行,请执行以下操作:

在您的XAML中(对于大小为640 x 480的窗口):

<Canvas x:Name="theCanvas">
    <Ellipse x:Name="theEllipse" Height="10" Width="10" Fill="Black" />     
</Canvas>

在上面的XAML所在的Window后面的代码中(确保添加对System.Windows.Media的引用以查看CompsitionTarget对象:

    public static Random rand = new Random();
    public View()
    {
        InitializeComponent();
        CompositionTarget.Rendering += CompositionTarget_Rendering;
    }

    void CompositionTarget_Rendering(object sender, System.EventArgs e)
    {
        double newLeft = rand.Next(0, 640);
        double newTop = rand.Next(0, 480);

        theEllipse.SetValue(Canvas.LeftProperty,newLeft);
        theEllipse.SetValue(Canvas.TopProperty, newTop);
    }

答案 4 :(得分:1)

你应该添加一个Canvas(或者为Canvas更改Grid),然后绘制它。 Here is Microsoft tut on drawing over a canvas

此外,我不知道this other question对您的相关程度如何,但您可能需要查看它。