为什么 WPF canvas 会导致 System.InvalidOperationException?

Why does a WPF canvas result in System.InvalidOperationException?

此 WPF 代码适用于一个程序。它不适用于正在创建的新程序。它导致异常 --- "System.InvalidOperationException: 'Specified element is already the logical child of another element. Disconnect it first.'"

这是 .xaml 代码的一部分:

<Canvas x:Name="gCanvasPlotTop"
  HorizontalAlignment="Left"
  VerticalAlignment="Top"
  Margin="0,0,0,0"
  Width="500"
  Height="150" />

<Canvas x:Name="gCanvasPlotBottom" 
  HorizontalAlignment="Left" 
  VerticalAlignment="Top" 
  Margin="0,0,0,0" 
  Width="500"
  Height="150" />

下面是部分.cs代码。

在我调用 dlgDisplayTwoXYPlots() 之前,我定义了 poXY:

Polyline poXYTop = new Polyline { Stroke = Brushes.Blue };
Polyline poXYBottom = new Polyline { Stroke = Brushes.Blue };

//------------------------------
public dlgDisplayTwoXYPlots(List<double> listdParamsTop,
                            List<Point> listPointsTop,
                            Polyline poXYTop,
                            List<double> listdParamsBottom,
                            List<Point> listPointsBottom,
                            Polyline poXYBottom)
{
  InitializeComponent();
  glistdParamsTop = listdParamsTop;
  glistPointsTop = listPointsTop;
  gpoXYTop = poXYTop;
  glistdParamsBottom = listdParamsBottom;
  glistPointsBottom = listPointsBottom;
  gpoXYBottom = poXYBottom;
}//DlgPlotXY()
//------------------------------
//------------------------------
private void Window_Loaded(object sender, RoutedEventArgs e)
{
  Plot(gCanvasPlotTop, gpoXYTop, glistdParamsTop, glistPointsTop);
  Plot(gCanvasPlotBottom, gpoXYBottom, glistdParamsBottom, glistPointsBottom);
}//Window_Loaded
//------------------------------
//------------------------------
private void Plot(Canvas canvas, Polyline poXY, List<double> listdParams, List<Point> listPoints)

{
  int iii = 0;
  int iNumOfPoints = (int)listdParams[iii++];
  double dXmin = listdParams[iii++];
  double dXmax = listdParams[iii++];
  double dYmin = listdParams[iii++];
  double dYmax = listdParams[iii++];

  double dPlotWidth = dXmax - dXmin;
  double dPlotHeight = dYmax - dYmin;

  for (int ii = 0; ii < iNumOfPoints; ii++) {
    var pointResult = new Point {
      X = (listPoints[ii].X - dXmin) * canvas.Width / dPlotWidth,
      Y = canvas.Height - (listPoints[ii].Y - dYmin) * canvas.Height / dPlotHeight
    };
    poXY.Points.Add(pointResult);
  }
  canvas.Children.Add(poXY);
//------------------------------

为什么 WPF canvas 会导致 System.InvalidOperationException?

在 MainWindow 我有

Polyline poXYTop = new Polyline { Stroke = Brushes.Blue};
Polyline poXYBottom = new Polyline { Stroke = Brushes.Blue};
OnePlot(listdSignalXValues, listdSignalYValues, poXYTop, "Signal");
TwoPlots(listdSignalXValues, listdSignalYValues, poXYTop, "Signal DupTop",
         listdSignalXValues, listdSignalYValues, poXYBottom, "Signal Bottom");

我曾假设 poXYTop 不会 return 带有附加信息的 poXYTop,因为它不是 ref poXYTop。现在我知道了。

这个有效:

Polyline poXY = new Polyline { Stroke = Brushes.Blue };
Polyline poXYTop = new Polyline { Stroke = Brushes.Blue };
Polyline poXYBottom = new Polyline { Stroke = Brushes.Blue };
OnePlot(listdSignalXValues, listdSignalYValues, poXY, "Signal");
TwoPlots(listdSignalXValues, listdSignalYValues, poXYTop, "Signal DupTop",
         listdSignalXValues, listdSignalYValues, poXYBottom, "Signal Bottom");