3

PAINT イベントを使用して、Winows フォーム アプリケーションのパネルに波を描画しました。しかし、WPF を使用すると、Paint Event を持つ Panel に相当する要素が見つかりませんでした。グーグルもたくさん使ったが、あまり役に立たなかった。

さて、私はWPFで波形を描く必要があるので、PaintArgsEventに関する適切な解決策または新しい解決策を完全に提案してください。

ありがとう!

4

1 に答える 1

2

あなたはクラスを探していますDrawingVisual

最初のリンクから:

DrawingVisual は、形状、画像、またはテキストのレンダリングに使用される軽量の描画クラスです。このクラスは、パフォーマンスを向上させるレイアウトまたはイベント処理を提供しないため、軽量と見なされます。このため、描画は背景やクリップ アートに最適です。


また、ポイント コレクションを追加できるPolyLine クラスにもアクセスできます。この例は、MSDN フォーラムの例を変更したものです

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

        float x0 = 100f;
        float y0 = 100f;
        Polyline myPoly = new Polyline();
        PointCollection polyPoints = myPoly.Points;
        Point[] points = new Point[200];

        for (int j = 0; j < 200; j++)
        {
            points[j] = new Point();
            points[j].X = x0 + j;
            points[j].Y = y0 -
            (float)(Math.Sin((2 * Math.PI * j) / 200) * (200 / (2 * Math.PI)));
        }

        for (int i = 0; i < points.Length ; i++)
        {
            polyPoints.Add(points[i]);
        }

        myPoly.Stroke = Brushes.Green;
        myPoly.StrokeThickness = 5;
        StackPanel mainPanel = new StackPanel();
        mainPanel.Children.Add(myPoly);
        this.Content = mainPanel;

    }
}

および変更された MSDN の例:

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

        float x0 = 100f;
        float y0 = 100f;
        Point[] points = new Point[200];

        for (int j = 0; j < 200; j++)
        {
            points[j] = new Point();
            points[j].X = x0 + j;
            points[j].Y = y0 -
            (float)(Math.Sin((2 * Math.PI * j) / 200) * (200 / (2 * Math.PI)));
        }

        DrawingBrush db = new DrawingBrush(CreateDrawingVisualRectangle(points).Drawing);
        StackPanel mainPanel = new StackPanel();
        mainPanel.Background = db;
        this.Content = mainPanel;

    }

    private DrawingVisual CreateDrawingVisualRectangle( Point[] pointarray)
    {
        DrawingVisual drawingVisual = new DrawingVisual();

        // Retrieve the DrawingContext in order to create new drawing content.
        DrawingContext drawingContext = drawingVisual.RenderOpen();

       // Create a rectangle and draw it in the DrawingContext.
       for (int i = 0; i < pointarray.Length-1; i++)
       {
           drawingContext.DrawLine(new Pen(new SolidColorBrush(Colors.Blue), 2), pointarray[i], pointarray[i + 1]);
       }

       // Persist the drawing content.
       drawingContext.Close();

       return drawingVisual;
     }

}
于 2012-12-11T04:44:32.143 に答える