C# 使用鼠标向下从画布中删除2种不同的对象类型

C# 使用鼠标向下从画布中删除2种不同的对象类型,c#,wpf,C#,Wpf,所以我有两种类型的对象放在画布上:矩形和文本框我的问题如下:我需要像橡皮擦一样用鼠标向下移动矩形和文本框。如果我只在屏幕上放置矩形,我只能移除矩形;如果我只在屏幕上放置文本框,我只能移除文本框。但是我需要在我的屏幕上用鼠标向下(鼠标)删除它们,因此对于示例:在我的屏幕上,它们是两个矩形和一个文本框,我点击它们,得到以下错误: 无法将System.Windows.Controls.TextBox类型的对象转换为System.Windows.Shapes.Rectangle类型 我知道这是一个铸造问

所以我有两种类型的对象放在画布上:矩形和文本框我的问题如下:我需要像橡皮擦一样用鼠标向下移动矩形和文本框。如果我只在屏幕上放置矩形,我只能移除矩形;如果我只在屏幕上放置文本框,我只能移除文本框。但是我需要在我的屏幕上用
鼠标向下
(鼠标)删除它们,因此对于示例:在我的屏幕上,它们是两个矩形和一个
文本框
,我点击它们,得到以下错误: 无法将System.Windows.Controls.TextBox类型的对象转换为System.Windows.Shapes.Rectangle类型

我知道这是一个铸造问题,但我尝试了很多东西

这是我目前的代码:

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);

    }
类橡皮擦
{
自有品牌地位;
私人名单;
私人列表文本框;
私有画布窗口;
公共橡皮擦(画布赢,标签状态)
{
这个状态=状态;
这个窗口=赢;
//Application.Current.mainfown.Cursor=新光标(AppDomain.CurrentDomain.BaseDirectory++./../Icons/橡皮擦.cur);
//Mouse.OverrideCursor=newCursor;
//Mouse.OverrideCursor=Application.Current.MainWindow.Cursor;
textboxen=新列表();
kaders=新列表();
foreach(win.Children中的对象元素)
{
if(元素为矩形)
{
Mouse.RemoveMouseDownHandler(窗口,项目\u Mousedown);
verzamelKaders();
}
else if(元素为文本框)
{
Mouse.RemoveMouseDownHandler(窗口,元素\u Mousedown);
verzamelTextboxen();
}
}
}
私有void verzamelKaders()
{
Mouse.RemoveMouseDownHandler(窗口,项目\u Mousedown);
foreach(window.Children中的矩形元素)
{
if(element.GetType()==typeof(矩形))
{
Mouse.RemoveMouseDownHandler(窗口,项目\u Mousedown);
添加(元素);
element.MouseDown+=新的鼠标按钮venthandler(element_MouseDown);
}
其他的
{
element.MouseDown+=新的鼠标按钮venthandler(项_MouseDown);
}
}
}
私有void verzamelTextboxen()
{
Mouse.RemoveMouseDownHandler(窗口,元素\u Mousedown);
foreach(window.Children中的文本框项)
{
if(item.GetType()==typeof(TextBox))
{
Mouse.RemoveMouseDownHandler(窗口,元素\u Mousedown);
textboxen.Add(项目);
item.PreviewMouseDown+=新鼠标按钮Venthandler(item_Mousedown);
}
其他的
{
item.MouseDown+=新的鼠标按钮venthandler(Element_MouseDown);
}
}
}
私有void元素_Mousedown(对象发送器,MouseButtonEventArgs e)
{
Mouse.RemoveMouseDownHandler(窗口,项目\u Mousedown);
矩形removekader=新矩形();
removekader=(矩形)发送器;
window.Children.Remove(removekader);
}
私有无效项_Mousedown(对象发送器,MouseButtonEventArgs e)
{
Mouse.RemoveMouseDownHandler(窗口,元素\u Mousedown);
TextBox removeTextbox=新建TextBox();
removeTextbox=(TextBox)发送方;
window.Children.Remove(removeTextbox);
}

}

为什么它如此复杂?下面的简单方法在指定位置从画布中移除任何子元素

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));
    }
}

非常感谢你!我知道这对我来说越来越复杂了。只有一件事,这段代码是干净的,泰!