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

试图在WPF窗口中绘制椭圆,但它不可见,wpf,draw,drawingcontext,onrender,drawellipse,Wpf,Draw,Drawingcontext,Onrender,Drawellipse,我正在尝试创建我自己的图形用户控件,我有一个已经在处理win表单,我正在尝试将它转移到WPF世界 我开始学习如何画图,所以我首先尝试画一个黑色椭圆,填充整个窗口,只是为了学习坐标在WPF中的工作原理 这是代码,当我运行应用程序时,没有显示任何内容,你知道我遗漏了什么吗 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); }

我正在尝试创建我自己的图形用户控件,我有一个已经在处理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);
    }
}

这是我做的样本

  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; }
    }

WPF与WinForms非常不同。您没有像绘制事件处理程序这样的东西,需要不断地重新绘制无效区域

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

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

谢谢sajeetharan,但是您能解释一下我的原始代码中缺少了什么吗?您应该将它添加到canvas-1中,以便在此处使用
CompositionTarget.Rendering
事件。这在这里绝对是不必要的,可能会把OP带到一个完全错误的方向。@Clemens甚至我都知道我们可以使用Ecclipse并绘制它,但我回答了他的问题!以一种非常非常令人困惑的方式!感谢您提供了完整详细的答案+1 Clemens,我遇到了相同的问题,即指定除
透明
之外的背景色会模糊我绘制的任何内容。是否可以将背景色设置为其他颜色,而不阻止绘制的内容?谢谢。@Sabuncu您的意思是在主窗口中有一个重写的OnRender方法?简而言之,你不应该这么做。如果你真的需要重写OnRender,你不应该在窗口中这样做,而应该在自定义控件中这样做。当我在XAML中为我的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);
    }
}