2013-05-20 19 views
3

我要畫線在WPF中的 「觸摸」 的應用程序,並寫了下面的代碼:如何更改我的代碼以製作多個線條形狀?

XAML(部分)

<Canvas x:Name="MainCanvas" 
      IsManipulationEnabled="True" 
      TouchDown="MainCanvas_TouchDown" 
      TouchUp="MainCanvas_TouchUp"> 

C#

public partial class MainWindow : Window 
{ 
    Line myLine = new Line(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void MainCanvas_TouchDown(object sender, TouchEventArgs e) 
    { 
     myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue; 
     myLine.StrokeThickness = 2; 
     // Line's starting point 
     myLine.X1 = e.GetTouchPoint(this).Position.X; 
     myLine.Y1 = e.GetTouchPoint(this).Position.Y; 
    } 

    public void MainCanvas_TouchUp(object sender, TouchEventArgs e) 
    { 
     // Line's ending point 
     myLine.X2 = e.GetTouchPoint(this).Position.X; 
     myLine.Y2 = e.GetTouchPoint(this).Position.Y; 

     MainCanvas.Children.Add(myLine); 


    } 
} 

有了這個,我只能畫一條線。如果我嘗試繪製另一個,應用程序崩潰。

+0

當你說「崩潰」是什麼錯誤? –

+0

一個消息框顯示,說「MyApp的停止工作「,有兩個按鈕:」調試「和」關閉程序「。我認爲這是正常的,因爲我總是使用相同的變量(第二次,它試圖將其添加到MainCanvas,但因爲它已經添加,該應用程序崩潰)。 –

+0

@brasofilo:謝謝,我確實有你說過。感謝編輯我的問題,我研究了你所做的改變,所以我會更好地寫下我未來的問題:) –

回答

2

對於要繪製的每一行,您都必須創建一個新的Line實例。在您當前的代碼中,您只有一個Line實例,但該實例僅代表一條顯示的行。

不同於其中使用各種對象來繪製圖形元素到一個描畫表面步步其他圖形工具,WPF的工作原理是矢量圖形:每次使用目的之一是圖形元素;對於兩個相同的圖形元素,您將需要兩個具有相同屬性的對象。

因此,當添加相同的圖形對象在第二時間,在這一行:

MainCanvas.Children.Add(myLine); 

例外,將被拋出,因爲只能添加每個圖形元素一次。

當你想添加任意行數,存儲您的線條在列表中添加一個新行實例(即實例化Line類和新行添加到畫布)在觸摸按下事件。在修改事件中,設置新實例的第二個點(列表中的最後一個元素)。

請注意,這不是關於C#,而是關於WPF。 (換句話說,一個從未與WPF合作過的C#專業人士將無法告訴你,但是從未使用過C#的WPF開發人員(例如VB.NET)可能會有幫助。

+0

非常感謝!隨着你的解釋,一切都終於明白了。我正在用解決方案更新我的第一條消息。 也感謝關於WPF/C#的精度。我將刪除標題中的C#標記和C#(如果可能)。 –

1

感謝OR映射的答案,這裏的解決方案。他解釋說,每行一個新的行實例必須創建。

public partial class MainWindow : Window 
{ 
    List<Line> lines = new List<Line>(); 

    public void MainCanvas_TouchDown(object sender, TouchEventArgs e) 
    { 
     Line myLine = new Line();   
     myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue; 
     myLine.StrokeThickness = 2; 
     myLine.X1 = e.GetTouchPoint(this).Position.X; 
     myLine.Y1 = e.GetTouchPoint(this).Position.Y; 
     lines.Add(myLine); 
    } 

    public void MainCanvas_TouchUp(object sender, TouchEventArgs e) 
    { 
     lines[lines.Count - 1].X2 = e.GetTouchPoint(this).Position.X; 
     lines[lines.Count - 1].Y2 = e.GetTouchPoint(this).Position.Y; 
     MainCanvas.Children.Add(lines[lines.Count - 1]); 
    } 
} 
相關問題