Toolkit ListBoxDragDropTarget 配合 WrapPanel 存在嚴重 JS 無法除錯錯誤,最終決定自行實現拖放邏輯核心模組。
ListBoxDragDropTarget 事件順序:
ItemDragStarting (源 ListBox) → 卡頓 (疑似遍歷開銷)ItemDragCompleted (源 ListBox)ItemDroppedOnSourceDrop (目標) → ItemDroppedOnTarget (源)其他事件:DragEnter、DragLeave、DragOver、GiveFeedback、QueryContinueDrag。
註冊標準拖放事件,針對物品類型驗證 (藥水不可裝備、部位限制等):
public event MouseButtonEventHandler MouseLeftButtonDoubleClick;
DispatcherTimer doubleClickTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(250) };
doubleClickTimer.Tick += (s, e) => { doubleClickTimer.Stop(); };
this.MouseLeftButtonDown += (s, e) => {
if (doubleClickTimer.IsEnabled) {
doubleClickTimer.Stop();
if (MouseLeftButtonDoubleClick != null) MouseLeftButtonDoubleClick(s, e);
} else {
doubleClickTimer.Start();
}
};
250ms 判定窗口,符合系統雙擊速度設定。
心得:Toolkit 拖放框架限制多、Bug 多、類型支援少。自行實現雖費時但可完全掌控流程 (誰被抓取、抓取源、放置目標、替換對象),且原理與 ChildWindow 實現異曲同工。期待官方框架成熟,但現階段自研是務實選擇。