2017-07-17 583 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)”仍然有点困惑... –