2017-07-17 162 views
-1

如何在WPF中優化Canvas繪圖,當我在程序「Paint」中有10000行時?當我畫「繪畫」時,我可以使用多少我需要線條和圓圈,但在我的程序agter + -10000中,我有滯後。 我用10000行創建一個測試程序,當我在畫布上移動鼠標矩形時,將位置更改爲光標。 這裏代碼如何優化WPF中的Canvas繪圖?

for (int i=0; i < 10000; i++) 
     { 
      Line l = new Line(); 
      l.Stroke = Brushes.Black; 
      l.StrokeThickness = 1; 
      l.X1 = 50+ privi; 
      l.Y1 = 50 + privi; 
      l.X2 = 100 ; 
      l.Y2 = 100 + privi; 
      MainCanvas.Children.Add(l); 
      privi += 5; 
} 

,在這裏我移動

if (clicked) 
     { 
      Point p = Mouse.GetPosition(MainCanvas); 
      rect.Margin = new Thickness(p.X-25, p.Y - 25, 0, 0); 
     } 
enter code here 

UPDATE

privi = 5; 
Rectangle rect = new Rectangle(); 
rect.Fill = Brushes.Black; 
rect.Width = 50; 
rect.Height = 50; 
MainCanvas.Children.Add(rect) 
+0

什麼是rect?你只在初始化時畫線嗎?聽起來很奇怪的是Canvas應該具有的維度。假設privi = 0,當i = 10000時,l.X1 = 50050 ... –

+0

@SimoneCifani矩形,我嘗試在畫布上移動。這樣我檢查一個滯後。 –

+0

對不起,但我仍然不明白矩形的位置。查看代碼,直接在畫布中繪製線條。 rect是否包含MainCanvas或者它是另一個對象? –

回答

-1

我不知道,如果你需要的線條和矩形是在同畫布,否則我發現在第二個透明c中添加矩形MainCanvas上的anvas改善了反應性。

<Window x:Class="WpfApplication.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="1080" Width="1024"> 
    <Canvas Name="MainCanvas" MouseMove="MainCanvas_MouseMove"> 
     <Canvas Name="RectCanvas" Background="Transparent" MouseMove="RectCanvas_MouseMove"> 
     </Canvas> 
    </Canvas> 
</Window> 

public partial class MainWindow : Window 
{ 
    double privi = 5; 

    Rectangle rect; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     for (int i = 0; i < 10000; i++) 
     { 
      Line l = new Line(); 
      l.Stroke = Brushes.Black; 
      l.StrokeThickness = 1; 
      l.X1 = 50 + privi; 
      l.Y1 = 50 + privi; 
      l.X2 = 100; 
      l.Y2 = 100 + privi; 
      MainCanvas.Children.Add(l); 
      privi += 5; 
     } 

     rect = new Rectangle(); 
     rect.Width = 50; 
     rect.Height = 50;    
     rect.Fill = Brushes.Black; 
     Canvas.SetLeft(rect, 0); 
     Canvas.SetTop(rect, 0); 
     SecondCanvas.Children.Add(rect); 
    } 

    private void RectCanvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     //if (clicked) 
     { 
      Point p = Mouse.GetPosition(MainCanvas); 
      rect.Margin = new Thickness(p.X - 25, p.Y - 25, 0, 0); 
     } 
    } 
} 
+0

請再讀一個問題! 「...當我在畫布上移動鼠標矩形時,將光標移動到位置......」 不是** MouseDown **,而是** MouseMove **。 一切都好,不像我一樣,但它是一樣的。 –

+0

@VovaDowhanych:我用我的建議編輯了我的帖子。不知道它是否符合您的要求。對MouseMove事件中的「if(clicked)」仍然有點困惑... –