我不希望我的窗口"仅水平"或"仅垂直"调整大小.我可以在我的窗口上设置一个可以强制执行此操作的属性,还是有一个可以使用的漂亮的代码隐藏技巧?
您可以使用WPF的ViewBox保留内容的宽高比,并使用固定宽度和高度的控件.
让我们试一试.您可以更改ViewBox的"Stretch"属性以体验不同的结果.
这是我的screeen镜头:
您始终可以处理WM_WINDOWPOSCHANGING消息,这可以让您在调整大小过程中控制窗口大小和位置(而不是在用户完成大小调整后修复内容).
以下是您在WPF中的操作方法,我将这些代码与多个来源相结合,因此可能会出现一些语法错误.
internal enum WM { WINDOWPOSCHANGING = 0x0046, } [StructLayout(LayoutKind.Sequential)] internal struct WINDOWPOS { public IntPtr hwnd; public IntPtr hwndInsertAfter; public int x; public int y; public int cx; public int cy; public int flags; } private void Window_SourceInitialized(object sender, EventArgs ea) { HwndSource hwndSource = (HwndSource)HwndSource.FromVisual((Window)sender); hwndSource.AddHook(DragHook); } private static IntPtr DragHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled) { switch ((WM)msg) { case WM.WINDOWPOSCHANGING: { WINDOWPOS pos = (WINDOWPOS)Marshal.PtrToStructure(lParam, typeof(WINDOWPOS)); if ((pos.flags & (int)SWP.NOMOVE) != 0) { return IntPtr.Zero; } Window wnd = (Window)HwndSource.FromHwnd(hwnd).RootVisual; if (wnd == null) { return IntPtr.Zero; } bool changedPos = false; // *********************** // Here you check the values inside the pos structure // if you want to override tehm just change the pos // structure and set changedPos to true // *********************** if (!changedPos) { return IntPtr.Zero; } Marshal.StructureToPtr(pos, lParam, true); handeled = true; } break; } return IntPtr.Zero; }
这就是我的解决方案.
您需要将其添加到控件/窗口标记中:
Loaded="Window_Loaded"
你需要将它放在你的代码中:
private double aspectRatio = 0.0; private void Window_Loaded(object sender, RoutedEventArgs e) { aspectRatio = this.ActualWidth / this.ActualHeight; } protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) { if (sizeInfo.WidthChanged) { this.Width = sizeInfo.NewSize.Height * aspectRatio; } else { this.Height = sizeInfo.NewSize.Width * aspectRatio; } }
我尝试了Viewbox技巧,但我不喜欢它.我想将窗口边框锁定到特定大小.这是在窗口控件上测试的,但我认为它也适用于边框.