Как добавить элемент управления в точке щелчка мышью в WrapPanel

У меня есть WrapPanel в моей программе, что некоторые кнопки добавить к нему во время выполнения (например, панель для добавления тегов для вопроса на этом сайте). Теперь я хочу щелкнуть между кнопками и добавить новую кнопку в месте, где нажата мышь. Но я не знаю, как я могу получить положение мыши между кнопками или как получить дочерний индекс кнопки, которая была помещена перед щелчком мыши!

И я должен сказать, что я должен использовать WrapPanelЯ не хочу использовать Canvas или другой контейнер.

Спасибо за вашу помощь..

2 ответа

Используйте этот код в MouseClick событие вашего WrapPanel:

Button b = new Button();
b.Location = new Point(MousePosition.X-this.ClientSize.Width, MousePosition.Y-this.ClientSize.Height);
this.Controls.Add(b);

Обновить:

Button b = new Button();
b.Location = new Point(MousePosition.X - this.ClientSize.Width, MousePosition.Y - this.ClientSize.Height);
this.WrapPanel1.Controls.Add(b);

Обновление 2:

Button mybutton = new Button();
        mybutton.Content = "This is wpf button";
        Point mousePoint = this.PointToScreen(Mouse.GetPosition(this));  
        MainWindow win = new MainWindow();  
        win.Left = mousePoint.X;  
        win.Top = mousePoint.Y;
        mybutton.PointToScreen(new Point(win.Left,win.Top));
        wrapPanel1.Children.Add(mybutton);

Моя проблема решена с помощью этого кода:

  private void wpContainer_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Button newButton = new Button()
                         {
                             Content= wpContainer.Children.Count,

                             Margin = new Thickness()
                             {
                                 Right = 10,

                                 Left = 10,
                             }
                         };

        var mousePosition = Mouse.GetPosition(wpContainer);

        int index=0;

        foreach (var child in wpContainer.Children)
        {
            Button currentButton = (child as Button);

            if (currentButton==null)
                continue;

            Point buttonPosition = currentButton.TransformToAncestor(wpContainer).Transform(new Point(0, 0));

            if (buttonPosition.X  > mousePosition.X && buttonPosition.Y+currentButton.ActualHeight > mousePosition.Y)
            {
                wpContainer.Children.Insert(index, newButton);

                return;                    
            }

            index++;
        }

        if(wpContainer.Children.Count==0 || index==wpContainer.Children.Count) //no items where detected so add it to the end of the Children
            wpContainer.Children.Add(newButton);
    }
Другие вопросы по тегам