XAML 在wpf中移动无边框窗口

kx1ctssn  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(186)

In my C# WinForms app I have a main window that has its default controls hidden.
So to allow me to move it around I added the following to the main window:

private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
private const int WM_NCLBUTTONDBLCLK = 0x00A3;

protected override void WndProc(ref Message message)
{
    if (message.Msg == WM_NCLBUTTONDBLCLK)
    {
        message.Result = IntPtr.Zero;
        return;
    }

    base.WndProc(ref message);

    //Allow window to move
    if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
        message.Result = (IntPtr)HTCAPTION;
}

I have a WPF App where I have also hidden the default controls and I want to do the same. I see that the main window is derived from a 'Window' so the above code does not work. How do I do this in WPF?

neskvpey

neskvpey1#

为此,您需要将一个事件处理程序附加到窗口的MouseDown事件,检查是否按下了鼠标左键,并在窗口上调用DragMove方法。
以下是具有此功能的窗口示例:

public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();
        MouseDown += Window_MouseDown;
    }

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Left)
            DragMove();
    }
}
laximzn5

laximzn52#

这非常简单,在这里:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
    DragMove();
}
f1tvaqid

f1tvaqid3#

First of all, you need to make sure that user wants to drag the window. So left button of mouse should be down and it should be moving a least some pixels. Create a point property to store cursor's exact point and add two events to window itself: PreviewMouseLeftButtonDown and MouseMove. Check the code below.

private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  Position = e.GetPosition(null);
}


private void Window_MouseMove(object sender, MouseEventArgs e)
    {

        Point mousePos = e.GetPosition(null);
        Vector diff = Position - mousePos;

        if (e.LeftButton == MouseButtonState.Pressed &&
            (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
        {
            DragMove();
        }
    }

相关问题