【问题标题】:How to remove element inside canvas from another event?如何从另一个事件中删除画布内的元素?
【发布时间】:2014-01-08 09:53:24
【问题描述】:

我在 Silverlight 中工作,我有一个 MouseMove 事件,它在画布(子窗口)上绘制一些东西

 private void CanvasArt_MouseMove(object sender, MouseEventArgs e)
 {
      if (drawing)
     {
          Point current = e.GetPosition((UIElement)sender);
          Line line = new Line() { X1 = start.X, Y1 = start.Y, X2 = current.X, Y2 = current.Y };
          line.Stroke = new SolidColorBrush(Colors.Red);
          line.StrokeThickness = 1;
          CanvasArt.Children.Add(line);
          start = current;
     }
 }

我在那个子窗口上有按钮

 private void ButtonSave_Click(object sender, RoutedEventArgs e)
 {

     this.DialogResult = true;
     ExtendedImage MyCanvasImage = CanvasArt.ToImage();
     CanvasArt.Children.Remove(line);// the 'line' is underlined in red marks and
     //says 'line' doesnot exist in current context
 }

如何解决?

【问题讨论】:

  • 如果您只想删除该行,您可以将对它的引用存储为类中的私有字段。如果要删除所有元素,可以使用函数 CanvasArt.Children.Clear()
  • 请将其发布为答案。 @FlatEric
  • 完成。作为答案发布

标签: c# asp.net wpf silverlight canvas


【解决方案1】:

您可以清除画布的对象。

Canvas.Children.Clear()

这应该清除画布上的内容

【讨论】:

    【解决方案2】:

    如果您只想删除该行,您可以将对其的引用作为私有字段存储在您的类中。如果要删除所有元素,可以使用函数 CanvasArt.Children.Clear()

    【讨论】:

      【解决方案3】:

      您需要能够识别Canvas 中的每个元素。如果它们只有几个,那么您可以在后面的代码中保留对它们的引用。但是,如果您可以在 Canvas 中包含许多元素,那么您可以使用 Tag 属性来识别它们:

       private void CanvasArt_MouseMove(object sender, MouseEventArgs e)
       {
           if (drawing)
           {
                Point current = e.GetPosition((UIElement)sender);
                Line line = new Line() { X1 = start.X, Y1 = start.Y, X2 = current.X, Y2 = current.Y };
                line.Tag = GetNextIdValue();
                line.Stroke = new SolidColorBrush(Colors.Red);
                line.StrokeThickness = 1;
                CanvasArt.Children.Add(line);
                start = current;
           }
       }
      
       private void ButtonSave_Click(object sender, RoutedEventArgs e)
       {                
           this.DialogResult = true;
           ExtendedImage MyCanvasImage = CanvasArt.ToImage();
      
           // Retrieve line from CanvasArt.Children
           Line line = (from c in CanvasArt.Children
                        where c.Tag.ToString() == "SomeValue"
                        select c).FirstOrDefault() as Line;
      
           CanvasArt.Children.Remove(line);
       }
      

      您可以实现 GetNextIdValue 方法以返回您想要的任何 ID 值。

      【讨论】:

        【解决方案4】:

        是的,line 是在CanvasArt_MouseMove 中声明的局部变量,你不能访问其他方法的局部变量。

        你有两个选择

        1. CanvasArt.Children 收藏中找出您的线路
        2. 将该行作为字段存储在类中,而不是作为局部变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-13
          • 2011-05-19
          • 1970-01-01
          • 2021-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-28
          相关资源
          最近更新 更多