【发布时间】:2017-02-16 15:49:06
【问题描述】:
我正在用 C# 开发一个 WPF,我想多次绘制一条特定的线,不会丢失之前的轨迹。我有 10 buttons 在我的 Grid 里面,我按下一个时,我想画一条线。对于这条线,我使用 var redLine 并且每次按下按钮时,它都会收到一对特定的坐标。
我用这段代码画线:
public partial class MainWindow : Window {
private Line redLine = new Line();
SolidColorBrush redBrush = new SolidColorBrush(Colors.Red);
public MainWindow()
{
redLine.StrokeThickness = 4;
redLine.Stroke = redBrush;
}
private void button1_Click(object sender, RoutedEventArgs e) {
redLine.X1 = 237;
redLine.Y1 = 382;
redLine.X2 = 288;
redLine.Y2 = 409;
//draw the line
MainGrid.Children.Add(redLine);
}
private void button2_Click(object sender, RoutedEventArgs e) {
redLine.X1 = 130;
redLine.Y1 = 323;
redLine.X2 = 238;
redLine.Y2 = 690;
//draw the line
MainGrid.Children.Add(redLine);
}
}
但每次我按button1 然后按button2 时都会出现此错误(其他按钮也会出现此错误):
错误 指定的视觉对象已经是另一个视觉对象的子对象或某个对象的根 构图目标。
我确实想保留两条线,而不是为了绘制第二条而删除第一条。关于如何解决它的任何想法?
注意我不想在每个 buttonX_Click 方法中声明每一行(整个程序大约有 11 行)。
【问题讨论】:
-
“我不想在每个 buttonX_Click 方法中声明每一行(整个程序大约有 11 行)。” 为什么不呢?它可能会解决问题。是否纯粹是为了不必重复宽度/画笔等的实例化/设置?
-
不应该是
CheckBoxes 来显示/隐藏行吗?在 WPF 中,您可以使用数据模板来可视化项目集合(在您的案例中)。见this。只需将新项目添加到集合中,新行就会出现在视图中。 -
@JamesThorpe 我认为从编程方面一遍又一遍地声明每一行是“正确的”。
-
我没有说这是最终解决方案,我只是想知道这是否是不重新声明它的原因。如果这是的原因,那么还有其他方法,比如让每个按钮调用一个仅提供坐标的函数,并让该单个函数创建线,设置属性并添加它。
-
@Sinatr 我正在尝试创建类似于“图像映射”的东西。所以我不想要 CheckBox,因为它会一直显示,不像按钮。
标签: c# wpf visual-studio lines children