尝试在WPF窗口中绘制椭圆,但它不可见

时间:2014-03-27 00:57:51

标签: wpf draw drawingcontext onrender drawellipse

我正在尝试创建自己的图形用户控件,我已经有一个已经在win表单上工作,我正在尝试将其转移到WPF世界。

我开始学习如何绘图,所以我首先尝试绘制一个填充整个窗口的黑色椭圆,只是为了了解坐标在WPF中是如何工作的。

所以这是代码,当我运行应用程序时,没有显示任何内容,知道我缺少什么?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        drawingContext.DrawEllipse(Brushes.Black, new Pen(Brushes.Black, 1), new Point(Width / 2, Height / 2), Width / 2, Height / 2);
    }
}

2 个答案:

答案 0 :(得分:6)

WPF与WinForms截然不同。你没有类似Paint事件处理程序的东西,你经常需要重新绘制无效区域。

在WPF中绘制填充整个窗口区域的椭圆的简单方法是XAML:

<Window ...>
    <Grid>
        <Ellipse Stroke="Black" Fill="Black"/>
    </Grid>
</Window>

但当然还有很多其他方法可以达到相同的效果。

如果您需要做更复杂的事情,WPF提供了大量支持图形和多媒体的课程。我建议您开始阅读MSDN上的在线文档的Graphics部分。


回到你的具体问题,有几件事需要提及。

首先,如果您已将Window的Background属性设置为Transparent,并且已使用Black以外的颜色绘制椭圆,则会看到OnRender覆盖的结果。< / p>

然后你会意识到绘制的椭圆大于窗口的客户区。这是因为WidthHeight属性的值包含Window边框。即使这样,使用WidthHeight属性获取WPF中UI元素的实际宽度和高度也不是正确的方法,因为除非明确设置,否则这些属性将返回double.NaN (在Window类中除外)。

相反,您通常会使用ActualWidthActualHeight属性,就像在此UserControl中一样(可能完全符合您的意图):

public partial class DrawingControl : UserControl
{
    public DrawingControl()
    {
        InitializeComponent();
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        drawingContext.DrawEllipse(Brushes.Black,
            new Pen(Brushes.Black, 1),
            new Point(ActualWidth / 2, ActualHeight / 2),
            ActualWidth / 2, ActualHeight / 2);
    }
}

答案 1 :(得分:1)

这是我做的样本,

  public MainWindow()
    {
        InitializeComponent();

        var canvas = new Canvas();
        Content = canvas;

        var element = new DrawingVisualElement();

        canvas.Children.Add(element);
        CompositionTarget.Rendering += (s, e) =>
        {

            using (var dc = element.visual.RenderOpen())
                dc.DrawEllipse(Brushes.Black,
               new Pen(Brushes.Blue, 3),        // Border
               new Point(120, 120), 20, 40); 
        };

        Mouse.Capture(canvas);
        MouseDown += (s, e) => Mouse.Capture((UIElement)s);
        MouseMove += (s, e) => Title = e.GetPosition(canvas).ToString();
        MouseUp += (s, e) => Mouse.Capture(null);


    }
    class DrawingVisualElement : FrameworkElement
    {
        public DrawingVisual visual;

        public DrawingVisualElement() { visual = new DrawingVisual(); }

        protected override int VisualChildrenCount { get { return 1; } }

        protected override Visual GetVisualChild(int index) { return visual; }
    }