Ответ 1
Вы можете использовать метод Window.DragMove в событии мыши вниз.
Я пытаюсь создать форму С# WPF, где я могу перетащить ее по экрану, щелкнув по ней и двигаясь с помощью мыши. характеристики форм включают в себя полностью прозрачные и содержащие только одно изображение. При этом стиль окна не имеет значения, и он не отображается на панели задач. Таким образом, практически все, что вы можете видеть, когда приложение работает, - это небольшое изображение - и в идеале я хочу, чтобы его можно было перетащить на рабочий стол, если я нажму и удерживаю левую кнопку мыши и перемещаю его.
Кто-нибудь знает простой способ, которым я могу выполнить это, или я упустил функцию сборки?
Спасибо.
Вы можете использовать метод Window.DragMove в событии мыши вниз.
Предыдущие ответы попали в ответ, но полный пример:
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
DragMove();
}
}
Вот некоторый упрощенный код для перетаскивания формы 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);
}
Если вы, как и я, хотите иметь немного больше контроля над 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?
при загрузке Windows или событии загрузки сетки вы можете использовать делегат для запуска функции DragMove().
`private void Grid_Loaded (отправитель объекта, RoutedEventArgs e) {
this.MouseDown += delegate{DragMove();};
}`