簡體   English   中英

WPF 裝飾器有什么意義?

[英]What's the point to WPF adorners?

我最近為我的公司開發了一個繪圖組件,其中包含一個 Canvas,您可以在其上使用單擊並拖動來繪制某些形狀。 對於每個形狀,我在其 AdornerLayer 上放置了兩個裝飾器:一個用於增加命中檢測(基本上是一個透明矩形,將超出形狀的邊界幾個像素),另一個用於調整大小(角落上的四個 Thumb 控件)。

但是,在實現組件的一些功能時,我遇到了很多問題,這些都是與裝飾器相關的。

  • 他們捕獲了所有預覽事件,因為它們位於 Canvas 本身之外的另一個可視化樹中,這是出乎意料的,但我找到了一種解決方法,即使我不太喜歡它。 使用 AdornerDecorator 並沒有解決這個問題,我實現的選擇裝飾器是預覽事件的黑洞。

  • 當我在 Canvas 上實現形狀的 z-index 操作(發送到后面、帶到前面等)時,它使用 Panel.SetZIndex 可以正常工作,正如您所期望的那樣。 但是,裝飾器位於另一個視覺樹中,因此它們不受影響,選擇裝飾器仍然位於所有其他形狀之上。 即使這些形狀位於選擇裝飾器正在檢測命中的形狀之上:例如,Shape1。 選擇裝飾器 1,形狀 2。 SelectionAdorner2,Shape1 位於 Shape2 的頂部(稍后添加到畫布中)。 所以它重疊了。 因此,SelectionAdorner1 將檢測到單擊它,我操縱 ZIndex 將其發送回。 現在 Shape2 位於頂部並與 Shape1 重疊,我單擊 Shape2 的頂部。 但點擊是由 SelectionAdorner1 而不是 SelectionAdorner2 檢測到的。 這特別煩人,所以,顯然因為裝飾器在另一個視覺樹上。 他們不尊重 ZIndexes。 我試圖通過在形狀的 ZIndex 和其 SelectionAdorner 的 ZIndex 之間創建一個 DataBinding(也可以通過手動設置)來解決它。 但這並沒有解決問題,改變 Adorners 的 ZIndex 並不會影響它們在屏幕上的顯示方式,也許我錯過了一些東西,但它不應該真的這么難。 因為裝飾器應該是為了讓事情變得更容易,所以我能想出的唯一解決方案是手動刪除所有裝飾器,然后一個接一個地手動添加它們。 最后加上應該在上面的那個,那是遲鈍的。 但它奏效了。

  • 接下來,裝飾器不尊重 ClipToBounds,我在 Canvas 中設置 ClipToBounds=true,我正在繪制它,它工作正常,但該死的裝飾器仍然可以工作。 解決這個問題的方法相對簡單,我只是在每個 Shape 的頂部添加了一個 AdornerDecorator。 IMO 不是一個理想的解決方案,但足夠簡單。

  • 裝飾者並不總是對在其裝飾元素上執行的 LayoutTransform 反應良好。 我在 canvas 頂部有一個面板,它實現了縮放和平移功能。 它使用動畫使放大和縮小更加平滑。 但是使用動畫導致我的裝飾器變成 go 猿,第一次縮放他們會簡單地忽略調整大小並保持相同的大小和位置,在第二次縮放時他們會縮放到裝飾元素的先前大小。 那沒有任何意義,我能找到的唯一解決方案是禁用動畫,謝天謝地

我不太記得我還有哪些其他問題,但這足以讓我懷疑 Adorner 的用處,我正在認真考慮在我的下一個項目中不使用它們,這與我描述的類似.

那么,誰能告訴我使用這些看似有用但令人難以置信的煩人的東西可能有什么好處?

我想你已經知道你的問題的答案了。 它們在某些方面節省時間,但在其他方面造成問題。 如果您要使用各種 UserControls 對這種設計器行為進行編碼,您會發現自己編寫了許多樣板控件類來包裝您實際想要編輯的元素。 另一方面,如果您嘗試編寫單獨的編輯控件並智能地覆蓋它們,那么您將編寫樣板代碼以保持它們的位置和大小同步。 您采用的方法,使用裝飾器,導致了很多(相當樣板的)代碼來管理事件。

雖然裝飾器可能不是完成這項特定任務的最佳工具,但它們仍然是其他更簡單任務的有用工具。 我最近寫了一個類似的“設計表面”,裝飾物是兩件的天賜之物:

  1. 拖放行為。 當我拖動不同的元素時,它們需要有不同的視覺預覽; 使用自定義裝飾器和數據模板非常容易完成。
  2. 選擇矩形或“套索”。 當您在 Windows 桌面上按住鼠標左鍵並拖動指針時,您會看到類似的內容。 它創建了一個半透明的盒子,可以 select 多個元素。 我幾乎可以立即使用裝飾層創建此行為,而創建我自己的自定義控件會導致大量不必要的簿記。

我認為您在項目中發現的是,您可能一直在使用裝飾器來嘗試完成太多事情。 但是不要把嬰兒和洗澡水一起扔出去——它們在某些情況下仍然非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM