Перемещение кнопки по форме мышью в WPF

309
15 ноября 2018, 01:00

Как можно реализовать перемещение кнопки мышью по форме? Ранее я это делал в WinForm вот так:

bool iMove = false;
Point dot;
void nazatie(object sender, MouseEventArgs e)///MouseDown
{
    Button temp = sender as Button;
    if(e.Button == MouseButtons.Left)
    {
        iMove = true;
        dot = e.Location;
    }
}
void naved(object sender, MouseEventArgs e)///MouseMove
{
    Button temp = sender as Button;
    if (iMove)
    {
        temp = (Button)sender;
        temp.Top += e.Y - dot.Y;
        temp.Left += e.X - dot.X;
    }
}

Как перемещение кнопки можно сделать в wpf, используя мышь?

Answer 1

В WPF идея такая же: запоминать точку клика и двигать по дельте. Нюанс в том, что контролы имеют абсолютные координаты только внутри Canvas (ну или с помощью отступов).

MainWindow.xaml

<Window x:Class="MouseMovableControl.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Canvas>
        <Label x:Name="btn" Content="Movable"
               MouseDown="Btn_OnMouseDown"
               MouseMove="Btn_OnMouseMove"
               MouseUp="Btn_OnMouseUp" />
    </Canvas>
</Window>

MainWindow.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace MouseMovableControl
{
    public partial class MainWindow
    {
        private Point? _movePoint;
        public MainWindow() => InitializeComponent();
        private void Btn_OnMouseDown(object sender, MouseButtonEventArgs e)
        {
            _movePoint = e.GetPosition(btn);
            btn.CaptureMouse();
        }
        private void Btn_OnMouseUp(object sender, MouseButtonEventArgs e)
        {
            _movePoint = null;
            btn.ReleaseMouseCapture();
        }
        private void Btn_OnMouseMove(object sender, MouseEventArgs e)
        {
            if (_movePoint == null)
                return;
            var p = e.GetPosition(this) - (Vector)_movePoint.Value;
            Canvas.SetLeft(btn, p.X);
            Canvas.SetTop(btn, p.Y);
        }
    }
}

Конкретно батоны двигать несколько затруднительно, потому что они проглатывают сообщения о кликах мыши.

READ ALSO
Компактность условия

Компактность условия

Как подобное условие можно сделать компактнее ?

187
Копия поля объекта C#

Копия поля объекта C#

Есть объект вида:

161
Как работать с `out` параметрами методов при `Setup`/`Verify` этих методов в мок-классе?

Как работать с `out` параметрами методов при `Setup`/`Verify` этих методов в мок-классе?

В зависимости от некоторого условия, количество вызовов Method2 не должно превышать 3Тест проверяет, срабатывает ли эта логика для конкретного...

183
C# DefaultView - добавить значение

C# DefaultView - добавить значение

Прошу помогите мне разобраться:

149