我想在WPF中的“touch”应用程序中绘制线条并编写以下代码:
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 :(得分:2)
对于您要绘制的每一行,您必须创建一个新的Line
实例。在当前代码中,您只有一个Line
实例,但该实例只代表一个显示的行。
与使用各种对象逐步将图形元素绘制到绘图表面上的其他图形工具包不同,WPF的工作方式与矢量图形类似:您使用的每个对象都是图形元素;对于两个相同的图形元素,您将需要两个具有相同属性的对象。
因此,当您第二次添加相同的图形对象时,在此行中:
MainCanvas.Children.Add(myLine);
将抛出异常,因为您只能添加一次图形元素。
当你想添加任意数量的行时,将你的行存储在一个列表中并添加一个新的行实例(即实例化Line
类并将新行添加到画布中)事件。在触摸事件中,设置新实例的第二个点(列表中的最后一个元素)。
请注意,这不是关于C#,而是关于WPF。 (换句话说,从未使用过WPF的C#专业人员无法告诉你,但是从未使用过C#(例如总是VB.NET)的WPF开发人员可能会提供帮助。
答案 1 :(得分:1)
感谢O. R. 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]);
}
}