WPF无边框窗口resize

我在WPF中设计自己的自定义窗口,我一直在尝试实现我之前在WinForms中使用的resizefunction。 由于某种原因,我的WndProc的返回值没有给我正确的结果。

我有一个NativeMethods类用于我的所有WndProc消息和结果:

public class NativeMethods { public const int WM_NCHITTEST = 0x84; public const int HTCAPTION = 2; public const int HTLEFT = 10; public const int HTRIGHT = 11; public const int HTTOP = 12; public const int HTTOPLEFT = 13; public const int HTTOPRIGHT = 14; public const int HTBOTTOM = 15; public const int HTBOTTOMLEFT = 16; public const int HTBOTTOMRIGHT = 17; } 

这是我的窗口背后的代码:

 public partial class MainWindow : Window { const int GripSize = 16; const int BorderSize = 7; public MainWindow() { InitializeComponent(); } protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); IntPtr windowHandle = new WindowInteropHelper(this).Handle; HwndSource windowSource = HwndSource.FromHwnd(windowHandle); windowSource.AddHook(WndProc); } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == NativeMethods.WM_NCHITTEST) { int x = lParam.ToInt32() <> 16, y = lParam.ToInt32() >> 16; Point pos = PointFromScreen(new Point(x, y)); if (pos.X > GripSize && pos.X = ActualHeight - BorderSize) { return (IntPtr)NativeMethods.HTBOTTOM; // This doesn't work? } // Top, Left, Right, Corners, Etc. } return IntPtr.Zero; } } 

我希望光标更改为“resize向下箭头”和resizefunction,就像在WinForms项目中一样。 我设置了断点,当光标位于预期位置时,HTBOTTOM返回被触发。 在XAML中,我将ResizeMode设置为CanResize,将WindowStyle设置为None。 我究竟做错了什么?

也许分配WindowChrome更简单。根据你的评论,你必须能够从所有方面resize以及使用grip.You可以通过将WindowStyle设置为None和ResizeMode设置为CanResizeWithGrip或CanResize(无论你想要什么)来完成所有这些操作。 acheive)

  

在代码behid中,您必须为窗口设置Window Chrome。 你可以这样做:

 WindowChrome.SetWindowChrome(this, new WindowChrome()); 

或者您可以使用setter作为窗口样式,如:

      

MSDN链接以获取更多信息

请注意,WindowChrome类是.NET 4.5 Framework的一部分。 对于.NET 4.0用户,请查看archive.msdn.microsoft.com/WPFShell

那是一个愚蠢的错误。 我忘了添加handled = true; 在我返回结果之前。 现在窗口正常运行。 作为注释,如果将ResizeMode设置为NoResize,则此代码根本不起作用。

我在另一篇文章中写了一个解决方案,你可以调整窗口大小,你需要使用.NET 4.5或WPFShell

你也可以将WindowChrome代码直接放在你的MainWindow.xaml上,它可以完美地工作而不需要设置setter。

       

你可以到这里查看完整的post。

这是之前和之后

挑战解决方案

我还为一个你可能感兴趣的完全工作(大小等)WPF无边框窗口提供了源代码。可以在这里找到它。

WPF无边框窗口问题:Aero Snap和最大化