是否可以制作一个 Window
,当用户调整它的高度时,它可以递增和递减 10?有点像捕捉调整大小。
最佳答案
这是一个如何做到这一点的例子:
using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;
namespace DeleteMeWPF {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow {
public MainWindow() {
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e) {
base.OnSourceInitialized(e);
IntPtr handle = new WindowInteropHelper(this).Handle;
HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(this.WindowProc));
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT {
public int left;
public int top;
public int right;
public int bottom;
}
private const int WM_SIZING = 0x0214;
private const int WMSZ_BOTTOM = 6;
private const int WMSZ_BOTTOMLEFT = 7;
private const int WMSZ_BOTTOMRIGHT = 8;
private const int WMSZ_LEFT = 1;
private const int WMSZ_RIGHT = 2;
private const int WMSZ_TOP = 3;
private const int WMSZ_TOPLEFT = 4;
private const int WMSZ_TOPRIGHT = 5;
private const int SnappingIncrement = 100;
private const int SnappingThresholdWidth = 300;
private const int SnappingThresholdHeight = 400;
private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
switch (msg) {
case WM_SIZING:
RECT bounds = (RECT)Marshal.PtrToStructure(lParam, typeof(RECT));
int width = bounds.right - bounds.left;
int height = bounds.bottom - bounds.top;
switch (wParam.ToInt32()) {
case WMSZ_BOTTOM:
if (height > SnappingThresholdHeight)
bounds.bottom = bounds.top + ((int)((double)height / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_BOTTOMLEFT:
if (height > SnappingThresholdHeight)
bounds.bottom = bounds.top + ((int)((double)height / (double)SnappingIncrement) * SnappingIncrement);
if (width > SnappingThresholdWidth)
bounds.left = bounds.right - ((int)((double)width / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_BOTTOMRIGHT:
if (height > SnappingThresholdHeight)
bounds.bottom = bounds.top + ((int)((double)height / (double)SnappingIncrement) * SnappingIncrement);
if (width > SnappingThresholdWidth)
bounds.right = bounds.left + ((int)((double)width / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_LEFT:
if (width > SnappingThresholdWidth)
bounds.left = bounds.right - ((int)((double)width / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_RIGHT:
if (width > SnappingThresholdWidth)
bounds.right = bounds.left + ((int)((double)width / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_TOP:
if (height > SnappingThresholdHeight)
bounds.top = bounds.bottom - ((int)((double)height / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_TOPLEFT:
if (width > SnappingThresholdWidth)
bounds.left = bounds.right - ((int)((double)width / (double)SnappingIncrement) * SnappingIncrement);
if (height > SnappingThresholdHeight)
bounds.top = bounds.bottom - ((int)((double)height / (double)SnappingIncrement) * SnappingIncrement);
break;
case WMSZ_TOPRIGHT:
if (width > SnappingThresholdWidth)
bounds.right = bounds.left + ((int)((double)width / (double)SnappingIncrement) * SnappingIncrement);
if (height > SnappingThresholdHeight)
bounds.top = bounds.bottom - ((int)((double)height / (double)SnappingIncrement) * SnappingIncrement);
break;
}
Marshal.StructureToPtr(bounds, lParam, false);
break;
}
return IntPtr.Zero;
}
}
}
这使用 100 的增量来真正说明“捕捉”效果。此外,您还可以调整吸附阈值,确保吸附仅在尺寸超过给定宽度/高度时生效。
关于c# - 如何以增量方式调整 WPF 窗口的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5736229/