【问题标题】:C# WPF how to draw geometry groupC# WPF如何绘制几何组
【发布时间】:2019-11-08 16:41:03
【问题描述】:

我正在尝试创建一个简单的可视化,其中包含大量要绘制的几何对象(10,000+),但是我目前正在尝试了解程序的正确流程。我究竟如何以有效的方式将此几何组绘制到窗口?

namespace DataVisualizer
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Canvas newCanvas = new Canvas();
            DrawingGroup tmpDrawing = new DrawingGroup();
            GeometryGroup geoGroup = new GeometryGroup();
            Brush brush = new SolidColorBrush(Colors.Blue);
            int particleCount = 10000;
            int particleWidth = 5;
            int particleHeight = 5;
            Random rnd = new Random();

            //create all the geometry and add it too the geometry group
            for (int x = 0; x < particleCount; ++x)
            {
                geoGroup.Children.Add(new RectangleGeometry(new Rect(rnd.Next(500), rnd.Next(500), particleWidth, particleHeight)));
            }

            tmpDrawing.Children.Add(new GeometryDrawing(brush, null, geoGroup));


            newCanvas.Children.Add(new DrawingImage(tmpDrawing)); //does not work
            newCanvas.Background = new DrawingImage(tmpDrawing); //does not work

            //it seems i dont wana be using UIElement.. how do i effeciently draw geometry?
        }
    }
}

我发现网上没有一个简单的解释来概述一般流程。非常感谢任何帮助。

【问题讨论】:

  • 直接的方法是将 GeometryGroup 传递给 Path 元素的 Data 属性。

标签: c# wpf .net-core graphics geometry


【解决方案1】:
  1. [可选] 从 Control 继承以隔离绘图逻辑
  2. 覆盖 OnRender(DrawingContext dc)
  3. 使用 DrawingContext.DrawGeometry(画笔、钢笔、几何)

考虑冻结画笔、钢笔和几何图形以提高性能。 请记住,DrawingContext API 不会立即呈现。它更像是应用于绘图的 Builder 模式 - 它积累了关于渲染内容、渲染位置和方式的说明。

对于粒子系统,您可以通过使用 WriteableBitmap、Viewport3D 一些第 3 方 DirectX/OpenGL 包装器获得更好的结果,但对于 10 000 个矩形 OnRender() + InvalidateVisual() 可能就足够了

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2016-07-19
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多