Wpf 我必须如何更改代码以生成多个线型?

Wpf 我必须如何更改代码以生成多个线型?,wpf,Wpf,我想在WPF中的“touch”应用程序中绘制线条,并编写了以下代码: XAML(部分): <Canvas x:Name="MainCanvas" IsManipulationEnabled="True" TouchDown="MainCanvas_TouchDown" TouchUp="MainCanvas_TouchUp"> public partial class MainWindow : Window

我想在WPF中的“touch”应用程序中绘制线条,并编写了以下代码:

XAML(部分)

<Canvas x:Name="MainCanvas"
            IsManipulationEnabled="True"
            TouchDown="MainCanvas_TouchDown" 
            TouchUp="MainCanvas_TouchUp">
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);


    }
}

有了这个,我只能画一条线。如果我尝试绘制另一行,应用程序将崩溃。

对于要绘制的每一行,必须创建一个新的
实例。在当前代码中,您只有一个
实例,但该实例正好代表一个显示的行

与其他图形工具包不同的是,WPF使用各种对象一步一步地将图形元素绘制到绘图表面上,WPF的工作原理类似于矢量图形:您使用的每个对象都是图形元素;对于两个相同的图形元素,需要两个具有相同特性的对象

因此,当您第二次添加相同的图形对象时,在此行中:

MainCanvas.Children.Add(myLine);
将引发异常,因为每个图形元素只能添加一次

要添加任意数量的行,请将行存储在列表中,并在触碰事件中添加新行实例(即实例化
类并将新行添加到画布)。在触摸事件中,设置新实例的第二个点(列表中的最后一个元素)


请注意,这不是关于C#,而是关于WPF。(换句话说,一个从未使用过WPF的C#pro将无法告诉您,但一个从未使用过C#的WPF开发人员(例如始终使用VB.NET)可能会有所帮助。

多亏了O.R.Mapper的回答,以下是解决方案。正如他所解释的,每一行都必须创建一个新的行实例

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]);
    }
}
公共部分类主窗口:窗口
{
列表行=新列表();
public void MainCanvas_触地(对象发送方,触地事件参数e)
{
行myLine=新行();
myLine.Stroke=System.Windows.Media.Brushes.LightSteelBlue;
myLine.StrokeThickness=2;
myLine.X1=e.GetTouchPoint(this).Position.X;
myLine.Y1=e.GetTouchPoint(this).Position.Y;
行。添加(myLine);
}
public void MainCanvas_修补(对象发送方,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.Count-1]);
}
}

当你说“it crash”时,会出现什么错误?一个消息框显示“MyApp停止工作”,有两个按钮:“Debug”和“Close program”。我认为这很正常,因为我总是使用同一个变量(第二次,它试图将其添加到MainCanvas,但由于已经添加,应用程序崩溃)@brasofilo:谢谢你,我做了你说过的。也谢谢你编辑我的问题,我研究了你所做的修改,所以我会把我未来的问题写得更好:)真的很高兴:)我对这个主题了解不多,但也许更具描述性的标题是:
如何在WPF中制作多个线条?
。我认为获得好答案和投票的秘诀是:描述性标题、精心研究和格式化的内容以及示例代码。非常感谢!经过你的解释,我终于明白了一切。我正在用解决方案更新我的第一条消息。还感谢WPF/C的精确性。我正在删除标题中的C#标记和C#(如果可能的话)。