首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 元件控件實戰系列 (四) 下:可調整大小元件 ResizableComponent 與自訂 UITypeEditor 實作

     編輯:關於.NET

ResizableComponent 核心原理

  1. 將目標控件劃分 3×3 九宮格區域 (四角、四邊、中心),中心不響應,其餘八區域可選擇性啟用調整大小。
  2. MouseMove 偵測游標位置,進入邊緣區域切換對應 Cursors (SizeNWSE、SizeWE、SizeNS 等)。
  3. MouseDown 記錄起始螢幕座標。
  4. MouseMove (左鍵按住) 計算位移,依區域調整控件 Width/Height 及 Left/Top (向上/向左調整需同步移動位置)。
  5. MouseLeave 恢復預設游標。

關鍵屬性

屬性說明
Enable總開關
EnableInnerControl內部子控件覆蓋邊緣時是否轉發滑鼠事件
ResizableControl目標控件
ResizeBorderWidth虛擬邊框寬度 (觸發調整的像素範圍)
ResizeDirectionDirectionEnum: All/Horizontal/Vertical
ResizeHandleAreasFlags 屬性,FlagsAttribute + 自訂 UITypeEditor 視覺化勾選

ResizeHandleAreaEnum 旗標定義

[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 視覺化編輯器

  1. 繼承 UITypeEditor,GetEditStyle 回傳 DropDown。
  2. 建立自訂 UserControl (八個 CheckBox 排成九宮格,Appearance=Button)。
  3. 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;
    }
}

擴充屬性 (IExtenderProvider) 讓子控件可選擇參與

  • 實作 CanExtend、GetHandleResize、SetHandleResize。
  • 設計時屬性格欄自動為子控件新增 ResizableComponent1.HandleResize 屬性 (類似 ToolTip)。
  • 標題列按鈕設 false 避免拖曳時誤觸發調整大小。

已知問題

快速移動滑鼠時調整大小/移動會有延遲感,歡迎高手提供優化建議。

原始碼下載:https://www.bianceng.net/dotnet/201212/730.htm

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved