Перетащите форму WPF вокруг рабочего стола - PullRequest
16 голосов
/ 15 мая 2009

Я пытаюсь создать форму c # WPF, где я могу перетаскивать ее по экрану, нажимая на нее и перемещая мышью. характеристики форм включают в себя полностью прозрачность и содержание только одного изображения. Это означает, что стиль окна отсутствует, и он не отображается на панели задач. Так что, по сути, все, что вы можете увидеть, когда приложение запущено, это небольшое изображение - и в идеале я хочу иметь возможность перетаскивать его по рабочему столу, если я нажму и удерживаю левую кнопку мыши и перемещаю его.

Кто-нибудь знает простой способ, которым я могу это сделать, или я пропустил встроенную функцию?

Спасибо.

Ответы [ 5 ]

20 голосов
/ 10 августа 2010

Предыдущие ответы попали в ответ, но полный пример таков:

   private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            DragMove();
        }
    }
19 голосов
/ 15 мая 2009

Вы можете использовать метод Window.DragMove в событии мыши в окне.

3 голосов
/ 19 февраля 2014

Вот несколько упрощенных кодов для перетаскивания формы WPF по экрану. Возможно, вы видели этот код на разных постах, я просто изменил его, чтобы он соответствовал потребностям перетаскивания формы WPF.

Имейте в виду, что нам нужно захватить положение формы на MouseLeftButtonDown, чтобы мы могли удерживать указатель мыши в том же месте на форме, когда мы перетаскиваем его по экрану.

Вам также потребуется добавить следующую ссылку, чтобы получить положение мыши относительно экрана: System.Windows.Forms

Свойства, необходимые:

private bool _IsDragInProgress { get; set; }
private System.Windows.Point _FormMousePosition {get;set;}

Код:

        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            this._IsDragInProgress = true;
            this.CaptureMouse();
            this._FormMousePosition = e.GetPosition((UIElement)this);
            base.OnMouseLeftButtonDown(e);
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (!this._IsDragInProgress)
                return;

            System.Drawing.Point screenPos = (System.Drawing.Point)System.Windows.Forms.Cursor.Position;
            double top = (double)screenPos.Y - (double)this._FormMousePosition.Y;
            double left = (double)screenPos.X - (double)this._FormMousePosition.X;
            this.SetValue(MainWindow.TopProperty, top);
            this.SetValue(MainWindow.LeftProperty, left);
            base.OnMouseMove(e);
        }

        protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
        {
            this._IsDragInProgress = false;
            this.ReleaseMouseCapture();
            base.OnMouseLeftButtonUp(e);
        }
1 голос
/ 26 ноября 2013

Если вы, как и я, хотите немного больше контролировать DoDragMove () - говорит, чтобы окно всегда оставалось на границе текущего рабочего стола, я сделал это.

Использование:

public partial class MainWindow : Window
{
    private WindowsDragger _dragger;

    public MainWindow()
    {
        InitializeComponent();
        _dragger = new WindowsDragger(this);
    }
}

Класс помощника:

class WindowsDragger
{
    private readonly Window _window;
    private Point _dragDelta;

    public WindowsDragger(Window window)
    {
        _window = window;

        _window.MouseLeftButtonDown += MouseLeftButtonDown;
        _window.MouseLeftButtonUp += MouseLeftButtonUp;
        _window.MouseMove += MouseMove;
    }

    void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _dragDelta = e.GetPosition(_window);
        Mouse.Capture(_window);
    }

    void MouseMove(object sender, MouseEventArgs e)
    {
        if (Equals(_window, Mouse.Captured))
        {
            var pos = _window.PointToScreen(e.GetPosition(_window));
            var verifiedPos = CoerceWindowBound(pos - _dragDelta);
            _window.Left = verifiedPos.X;
            _window.Top = verifiedPos.Y;
        }
    }

    void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (Equals(_window, Mouse.Captured))
            Mouse.Capture(null);
    }

    private Vector CoerceWindowBound(Vector newPoint)
    {
        // Snap to the current desktop border
        var screen = WpfScreen.GetScreenFrom(_window);
        var wa = screen.WorkingArea;
        if (newPoint.X < wa.Top) newPoint.X = wa.Top;
        if (newPoint.Y < wa.Left) newPoint.Y = wa.Left;
        if (_window.Width + newPoint.X > wa.Right) newPoint.X = wa.Right - _window.Width;
        if (_window.Height + newPoint.Y > wa.Bottom) newPoint.Y = wa.Bottom - _window.Height;
        return newPoint;
    }
}

где WpfScreen отсюда: Как получить размер текущего экрана в WPF?

0 голосов
/ 30 ноября 2013

при загрузке Windows или событии загрузки сетки вы можете использовать делегат для запуска функции DragMove ().

`private void Grid_Loaded (отправитель объекта, RoutedEventArgs e) {

        this.MouseDown += delegate{DragMove();};

    }`
...