2010-01-04 65 views
3

我正在改進標準的WPF TabControl。我想向它添加分離功能: 用戶在TabControl之外拖動頁面,並且此頁面在窗口中取消。 我想在這個控制中的兩個事件 - PageDragStart(當頁面拖到外面時產生)和PageDragEnd(當頁面掉到外面時產生)掉在控制之外

我對第一個事件沒有任何問題。

但第二個... OnDrop不會調用,因爲該項目放在tabcontol容器外面。我怎麼知道它被丟棄了?

P.S.我想要一個通用的控制(所以,不應該連接的對接功能,並與窗口tabcontrol硬編碼放置或類似的東西)

+0

嗯...我無法添加答案,出於某種原因。問題:您是否在您嘗試拖動的控件上設置了AllowDrop? – 2010-01-04 23:45:35

+0

在Windows窗體中,我做了這個訣竅。 OnMouseUp甚至在TabControl之外調用。不幸的是,在WPF中,這個技巧不起作用 – xSeder 2010-01-04 23:46:06

+0

我的控件將會是黑盒子 - 它不知道其他控件。 但當然 - 當我在應用程序中使用它時 - 所有外圍控件都將AllowDrop設置爲true 問題是OnDrop(或OnMouseUp - 無關緊要)在TARGET控件中調用,而不是在源中調用。但我希望它在來源(最好是在雙方;)) – xSeder 2010-01-04 23:47:46

回答

0

我解決了問題 - 在相當殘酷和不安全的方式。但因爲它會作爲臨時解決方案。嗯,當我提高PageDragStart事件時,我調用Mouse.Capture(this,CaptureMode.SubTree); 當頁面被丟棄的地方 - DoDragDrop拋出不同的異常(COMException,NullReference(我無法找到哪個對象爲null)以及其他一些我不記得的東西)。 我捕捉異常並調用PageDragEnd事件(如果屬性IsPageDraggingOut設置爲true)。

就你所見,這個解決方案真的很髒,很糟糕。但它的工作。

那麼,任何其他想法(或一些想法如何正確使用Mouse.Capture)?

1

爲什麼要用DoDragDrop呢?當我在讀你的描述,通過自身使用Mouse.Capture似乎是顯而易見的解決方案:

  1. 手柄OnMouseLeftButtonDown在標籤上並基於命中測試
  2. 手柄開始捕捉
  3. 手柄的OnMouseMove選項卡上,並更新光標OnMouseLeftButtonUp選項卡上,並停止捕獲,並做出相應的變化

你可能沒有考慮過的DoDragDrop過簡單的鼠標捕獲的原因是:

  1. 與Windows集成OLE拖放使您可以將應用程序和技術
  2. 的DoDragDrop調用的模態性質(這實際上似乎是比較吃虧的對我來說)
  3. 自動命中測試之間下降目標
  4. 標準化「拖放操作」 API,允許不相關的應用來處理複製VS移動等

你顯然不需要OLE整合或支持多應用和你想定製命中測試,所以它eems DoDragDrop沒有直接處理鼠標捕獲的優勢。