0

したがって、キャンバスに配置するオブジェクトには、長方形とテキストボックスの 2 種類があります。私の問題は次のとおりです。消しゴムのように長方形とテキストボックスをマウスダウンで削除する必要があります。画面に四角形のみを配置した場合は四角形のみを削除でき、画面上にテキストボックスのみを配置した場合はテキストボックスのみを削除できます。Mousedownしかし、 (マウス)を使用して画面上で両方を削除する必要があるため、たとえば、画面上では 2 つの四角形と 1textboxであり、それらをクリックすると次のエラーが発生しました: 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);

    }

}

4

1 に答える 1

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

PreviewMouseDownCanvasのハンドラーで呼び出すことができます。

private void Canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (eraseChildren)
    {
        var canvas = sender as Canvas;
        RemoveChild(canvas, e.GetPosition(canvas));
    }
}
于 2013-03-01T11:00:42.260 に答える