gpt4 book ai didi

wpf - 使窗口在特定边界内可拖动 WPF

转载 作者:行者123 更新时间:2023-12-04 19:22:15 24 4
gpt4 key购买 nike

我有一个 wpf 子窗口,我允许使用 DragMove() 方法拖动它。但是,我需要允许窗口仅在其父窗口控件的范围内被拖动。

任何人都可以提出实现此目标的方法吗?谢谢!

最佳答案

有两种方法可以做到这一点。

使用 LocationEnded

如果您处理此事件,您可以将 Top 或 Left 更改为在所有者窗口的范围内。例如

    private void Window_LocationChanged(object sender, EventArgs e)
{

if (this.Left < this.Owner.Left)
this.Left = this.Owner.Left;

//... also right top and bottom
//
}

这很容易写,但是违反了Principle of least astonishment因为它没有绑定(bind)拖动窗口,所以当用户松开鼠标按钮时,它只是将窗口推回原位。

使用 AddHook

正如 Pieter 在 an answer 中指出的那样对于类似的问题,您可以 Interop to the Windows messaging and block the drag window。这对限制实际拖动窗口有很好的影响。

这是我为 AddHook 方法整理的一些示例代码

从加载的窗口开始添加钩子(Hook)

  //In Window_Loaded the handle is there (earlier its null) so this is good time to add the handler 

private void Window_Loaded(object sender, RoutedEventArgs e)
{

WindowInteropHelper helper = new WindowInteropHelper(this);
HwndSource.FromHwnd(helper.Handle).AddHook(HwndSourceHookHandler);
}

在您的处理程序中,您只想查找移动或移动消息。然后你将读取 lParam 矩形并查看它是否越界。如果是,您需要更改 lParam 矩形的值并将其编码回来。请注意,为了简洁起见,我只做了左边。您仍然需要写出正确的、顶部的和底部的情况。

 private IntPtr HwndSourceHookHandler(IntPtr hwnd, int msg, IntPtr wParam,
IntPtr lParam, ref bool handled)
{


const int WM_MOVING = 0x0216;
const int WM_MOVE = 0x0003;


switch (msg)
{
case WM_MOVING:
{


//read the lparm ino a struct

MoveRectangle rectangle = (MoveRectangle)Marshal.PtrToStructure(
lParam, typeof(MoveRectangle));


//

if (rectangle.Left < this.Owner.Left)
{
rectangle.Left = (int)this.Owner.Left;
rectangle.Right = rectangle.Left + (int)this.Width;
}



Marshal.StructureToPtr(rectangle, lParam, true);

break;
}
case WM_MOVE:
{
//Do the same thing as WM_MOVING You should probably enacapsulate that stuff so don'tn just copy and paste

break;
}


}

return IntPtr.Zero;

}

lParam 的结构

  [StructLayout(LayoutKind.Sequential)]
//Struct for Marshalling the lParam
public struct MoveRectangle
{
public int Left;
public int Top;
public int Right;
public int Bottom;

}

最后一点,如果允许子窗口大于父窗口,您需要弄清楚该怎么做。

关于wpf - 使窗口在特定边界内可拖动 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com