2

私は独自のグラフ ユーザー コントロールを作成しようとしています。既に 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);
    }
}
4

2 に答える 2

6

WPF は WinForms とは大きく異なります。無効化された領域を常に再描画する必要がある Paint イベント ハンドラーのようなものはありません。

WPF でウィンドウ領域全体を埋める楕円を描画する最も簡単な方法は、次の XAML です。

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

もちろん、同じ結果を得る方法は他にもたくさんあります。

より複雑なことを行う必要がある場合、WPF はグラフィックスとマルチメディアをサポートする多種多様なクラスを提供します。MSDN のオンライン ドキュメントのグラフィックセクションを読み始めることをお勧めします。


特定の問題に戻るには、言及すべきことがいくつかあります。

Backgroundまず、ウィンドウのプロパティを に設定しTransparent、楕円を 以外の色で描画した場合、OnRender オーバーライドの結果が表示されますBlack

次に、描画された楕円がウィンドウのクライアント領域よりも大きいことに気付くでしょう。これは、 プロパティWidthHeightプロパティの値にウィンドウの境界線が含まれているためです。それでも、 WPF で UI 要素の実際の幅と高さを取得するために プロパティWidthHeightプロパティを使用するのは適切な方法ではありません。これらのプロパティdouble.NaNは、明示的に設定されていない限り (Window クラスを除いて) 返されるためです。

代わりに、この UserControl のように、通常はプロパティActualWidthとプロパティを使用します (これは、おそらく意図したとおりに機能します)。ActualHeight

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);
    }
}
于 2014-03-27T10:22:20.050 に答える
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; }
    }
于 2014-03-27T04:40:31.657 に答える