簡體   English   中英

WPF - 在畫布上並行繪制多個矩形

[英]WPF - Draw multiple Rectangles on Canvas in parallel

我有類 BBox,它代表矩形 - 它包含矩形的坐標(x,y,寬度,高度)和顏色。 然后我有這些 BBox 的列表,其中包含大約 4000 個。 我需要盡快繪制所有存儲在畫布上的列表中的框。 最有效的方法是什么?

    private List<BBox> FoundBoxes { get; set; }

    public void DrawBoxes(Canvas canvas)
    {
            foreach (var box in FoundBoxes)
            {
                var brush = box.getColor();
                System.Windows.Shapes.Rectangle rect;
                rect = new System.Windows.Shapes.Rectangle
                {
                    Stroke = brush,
                    Height = box.Height,
                    Width = box.Width,
                    StrokeThickness = 1
                };
                Canvas.SetLeft(rect, box.TopLeftX);
                Canvas.SetTop(rect, box.TopLeftY);
                canvas.Children.Add(rect);
            }

}

上面的代碼需要超過 1 秒,這對我的應用程序來說很慢。 我確信必須有一種方法可以並行執行。 所以我試過這個:

 Parallel.ForEach(FoundBoxes, box =>
 {
      ...same method body...
 });

但它拋出

System.InvalidOperationException: 'The calling thread must be STA, because many UI components require this.'

我知道為什么會發生這種情況,我試圖找到解決方案,但對我沒有任何作用。 例如,我嘗試使用Dispatcher.Invoke(() =>運行它或使用 new Thread運行它,如下所述:

Thread t = new Thread(delegate ()
{
    Parallel.ForEach(FoundBoxes, box =>
    {
      ...same method body...
    });
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();

但它仍然拋出提到的異常。 我該如何解決這個問題? 或者有沒有更好/更有效的方法在畫布上繪制多個對象? 謝謝你。

好吧,我按照克萊門斯的建議使用WriteableBitmapEx解決了我的問題。 現在,實時繪制了 4000 多個框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM