Перетащите WPF-форму вокруг рабочего стола

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

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

Спасибо.

Ответы

Ответ 1

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

Ответ 2

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

   private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            DragMove();
        }
    }

Ответ 3

Вот некоторый упрощенный код для перетаскивания формы 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);
        }

Ответ 4

Если вы, как и я, хотите иметь немного больше контроля над 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?

Ответ 5

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

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

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

    }`