MouseMove 偵測游標位置,進入邊緣區域切換對應 Cursors (SizeNWSE、SizeWE、SizeNS 等)。MouseDown 記錄起始螢幕座標。MouseMove (左鍵按住) 計算位移,依區域調整控件 Width/Height 及 Left/Top (向上/向左調整需同步移動位置)。MouseLeave 恢復預設游標。| 屬性 | 說明 |
|---|---|
| Enable | 總開關 |
| EnableInnerControl | 內部子控件覆蓋邊緣時是否轉發滑鼠事件 |
| ResizableControl | 目標控件 |
| ResizeBorderWidth | 虛擬邊框寬度 (觸發調整的像素範圍) |
| ResizeDirection | DirectionEnum: All/Horizontal/Vertical |
| ResizeHandleAreas | Flags 屬性,FlagsAttribute + 自訂 UITypeEditor 視覺化勾選 |
[Flags]
[Editor(typeof(ResizeHandleAreaUITypeEditor), typeof(UITypeEditor))]
public enum ResizeHandleAreaEnum
{
Center = 0,
TopLeft = 1, TopCenter = 2, TopRight = 4,
CenterLeft = 8, CenterRight = 16,
BottomLeft = 32, BottomCenter = 64, BottomRight = 128
}
每值為 2 的冪次,利於位元運算組合。
UITypeEditor,GetEditStyle 回傳 DropDown。UserControl (八個 CheckBox 排成九宮格,Appearance=Button)。EditValue 中以 IWindowsFormsEditorService.DropDownControl 顯示編輯器,回傳使用者勾選結果。internal class ResizeHandleAreaUITypeEditor : UITypeEditor
{
private ResizeHandleAreaEditorControl _editor = new ResizeHandleAreaEditorControl();
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) => UITypeEditorEditStyle.DropDown;
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
_editor.SetValue((ResizeHandleAreaEnum)value);
var svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
svc.DropDownControl(_editor);
return _editor.ResizeHandleAreas;
}
}
CanExtend、GetHandleResize、SetHandleResize。ResizableComponent1.HandleResize 屬性 (類似 ToolTip)。false 避免拖曳時誤觸發調整大小。快速移動滑鼠時調整大小/移動會有延遲感,歡迎高手提供優化建議。