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

儘量不要創建不需要的形狀,並回收已有的形狀。基本上沒有用戶會看到整個屏幕,所以沒有看不見的形狀。不要創建新的,你可以避免 - 基本上保持形狀在「準備好」列表中,所以你可以重複使用它們。