2010-04-26 58 views
2

我正在写一个界面,其特点是一个大(〜50000px宽)的“画布”类型的区域,用于以一种相当新颖的方式显示大量数据。这涉及到很多线条,矩形和文本。用户可以滚动浏览整个画布。建议(简单)的方法在WPF中绘制大量的视觉元素?

目前我只是使用标准画布面板上放置了各种形状。这很好,很容易做到:构造一个形状,分配一些坐标,并将其附加到画布上。不幸的是,这很慢(构建孩子,而不是做实际的渲染)。我看过somealternatives,这有点吓人。我不需要任何花哨的东西 - 只是能够有效地构建和放置对象在坐标平面。如果我所得到的是线条,彩色矩形和文字,我会很高兴。

我是否需要Geometry内部的Geometry Group s内部的GeometryDrawing s在一些Panel容器内?

注:如果可能,我想在同一空间中包含文本和图形(即彩色矩形)。

回答

2

形状相当重。你应该看看使用图形路径。当用户不需要与绘图的各个部分进行交互时(有时甚至是时候),这些效率会更加高效。

-1

如果你有大量的Shape实例,你可能可以异步构造它们(在工作线程上),并通过Dispatcher排队实际的Add操作。这里的想法是,UI不会立即完成,但用户可以立即开始交互,而元素将继续加载。


编辑:上面是不正确的。 WPF确实需要在UI线程上创建视觉元素。你仍然可以使用的模式是这样完成这种“懒惰”的视觉负荷:

private Random _random = new Random(); 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     Thread testThread = new Thread(TestThread); 
     testThread.Start(); 
    } 

    private void TestThread() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      Dispatcher.BeginInvoke((Action)CreateShape); 
     } 
    } 

    private void CreateShape() 
    { 
     var shape = new Rectangle(); 
     shape.Width = _random.Next(10, 50); 
     shape.Height = _random.Next(10, 50); 
     shape.Fill = new SolidColorBrush(Colors.Red); 
     Canvas.SetLeft(shape, _random.Next(0, 400)); 
     Canvas.SetTop(shape, _random.Next(0, 200)); 
     LayoutRoot.Children.Add(shape);    
    } 

这基本上排队UI线程上进行“异步”运行的任务(即每当消息泵正在维修) ,因此您可以在执行“长期”UI更新时保持响应能力。

+1

-1:基本的Windows UI知识:UI元素必须在UI线程中创建 - 这里没有工作线程,伙计;) – TomTom 2010-04-26 23:30:26

+0

我站着纠正;我测试了这一点,创建一个Visual依赖于线程上下文。我以为它可能不会将它连接到UI基础结构,直到您真正将其添加到Visual Tree。 – 2010-04-27 01:53:18

+0

这是一个老问题,回到活动x次,并基本保持兼容性 - 您永远不知道子元素是否开始放置可能是活动x控件的窗体元素;) – TomTom 2010-04-27 07:07:40

1

尽量不要创建不需要的形状,并回收已有的形状。基本上没有用户会看到整个屏幕,所以没有看不见的形状。不要创建新的,你可以避免 - 基本上保持形状在“准备好”列表中,所以你可以重复使用它们。

相关问题