2013-03-01 29 views
0

所以我有2種類型的對象放置在我的畫布上:矩形和文本框。 我的問題是如下:我需要刪除與Mousedown矩形和文本框像橡皮擦。如果我只在屏幕上放置矩形,我只能移除一個矩形,如果只在屏幕上放置文本框,我只能移除文本框。但我需要用Mousedown(鼠標)刪除我的兩個屏幕上,以便爲例如:我的屏幕上,他們是2個矩形和1 textbox,我點擊它們,並得到了遵循錯誤: 無法轉換的對象鍵入System.Windows.Controls.TextBox到一個System.Windows.Shapes.Rectangle類型用鼠標從畫布中刪除2種不同的對象類型

我知道這是一個鑄造問題,但我嘗試了很多東西。

這是我的時刻代碼:

class Eraser 
{ 
    private Label status; 
    private List<Rectangle> kaders; 
    private List<TextBox> textboxen; 
    private Canvas window; 

    public Eraser(Canvas win, Label status) 
    { 
     this.status = status; 
     this.window = win; 
     //Application.Current.MainWindow.Cursor = new Cursor(AppDomain.CurrentDomain.BaseDirectory + @"../../Icons/eraser.cur"); 
     //Mouse.OverrideCursor = newCursor; 
     //Mouse.OverrideCursor = Application.Current.MainWindow.Cursor; 
     textboxen = new List<TextBox>(); 
     kaders = new List<Rectangle>(); 
     foreach (Object element in win.Children) 
     { 
      if (element is Rectangle) 
      { 
       Mouse.RemoveMouseDownHandler(window, item_Mousedown); 
       verzamelKaders(); 
      } 
      else if (element is TextBox) 
      { 
       Mouse.RemoveMouseDownHandler(window, Element_Mousedown); 
       verzamelTextboxen(); 
      } 
     } 

    } 
    private void verzamelKaders() 
    { 
     Mouse.RemoveMouseDownHandler(window, item_Mousedown); 

     foreach (Rectangle element in window.Children) 
     { 
      if (element.GetType() == typeof(Rectangle)) 
      { 
       Mouse.RemoveMouseDownHandler(window, item_Mousedown); 
       kaders.Add(element); 
       element.MouseDown += new MouseButtonEventHandler(Element_Mousedown); 
      } 
      else 
      { 
       element.MouseDown += new MouseButtonEventHandler(item_Mousedown); 
      } 
     } 

    } 
    private void verzamelTextboxen() 
    { 

     Mouse.RemoveMouseDownHandler(window, Element_Mousedown); 


     foreach (TextBox item in window.Children) 
     { 
      if (item.GetType() == typeof(TextBox)) 
      { 
       Mouse.RemoveMouseDownHandler(window, Element_Mousedown); 
       textboxen.Add(item); 
       item.PreviewMouseDown += new MouseButtonEventHandler(item_Mousedown); 
      } 
      else 
      { 
       item.MouseDown += new MouseButtonEventHandler(Element_Mousedown); 
      } 

     } 

    } 
    private void Element_Mousedown(object sender, MouseButtonEventArgs e) 
    { 
     Mouse.RemoveMouseDownHandler(window, item_Mousedown); 
     Rectangle removekader = new Rectangle(); 
     removekader = (Rectangle)sender; 
     window.Children.Remove(removekader); 

    } 
    private void item_Mousedown(object sender, MouseButtonEventArgs e) 
    { 

     Mouse.RemoveMouseDownHandler(window, Element_Mousedown); 
     TextBox removeTextbox = new TextBox(); 
     removeTextbox = (TextBox)sender; 
     window.Children.Remove(removeTextbox); 

    } 

}

回答

1

爲什麼會這樣極其複雜?下面的簡單方法從指定位置的Canvas中刪除任何子元素。

public static void RemoveChild(Canvas canvas, Point position) 
{ 
    var element = canvas.InputHitTest(position) as UIElement; 
    UIElement parent; 

    while (element != null && 
     (parent = VisualTreeHelper.GetParent(element) as UIElement) != canvas) 
    { 
     element = parent; 
    } 

    if (element != null) 
    { 
     canvas.Children.Remove(element); 
    } 
} 

你可以把它在PreviewMouseDown處理您的畫布:

private void Canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (eraseChildren) 
    { 
     var canvas = sender as Canvas; 
     RemoveChild(canvas, e.GetPosition(canvas)); 
    } 
} 
+0

非常感謝您!我知道這對我來說變得複雜了。只是一件事,這段代碼很乾淨,Ty! – 2013-03-03 11:30:23