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);


    }
}

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

4

2 回答 2

2

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

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

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

MainCanvas.Children.Add(myLine);

将抛出异常,因为您只能添加每个图形元素一次。

当您想添加任意数量的行时,将您的行存储在一个列表中并Line在 touch-down 事件中添加一个新的行实例(即实例化类并将您的新行添加到画布)。在修饰事件中,设置新实例的第二个点(列表中的最后一个元素)。

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

于 2013-05-20T00:53:08.727 回答
1

感谢 OR Mapper 的回答,这就是解决方案。正如他解释的那样,必须为每一行创建一个新的 Line 实例。

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]);
    }
}
于 2013-07-09T18:21:35.190 回答