我需要在WPF中爲工作項目編寫一個計量器控件。通過儀表控制,我的意思是類似於傳統汽車車速表的東西:圓周上有數字和刻度的圓形面,以及指向當前值的指針。雖然我可以讓我的僱主購買第三方控件,甚至在某處找到免費的控件,但我仍然喜歡自己寫這個控件,因爲好奇心比其他任何東西都要好。在WPF中編寫自定義厚度控件的最佳方式?
我的第一個想法是使用模板「皮膚」現有控件,例如ProgressBar,因爲它具有Minimum,Maximum和Value屬性。但是,我認爲這不會爲我提供所需的靈活性。
我想動畫指向當前值的指針,以便當指針值改變時指針從舊值移動到新值。我認爲最簡單的方法是使用代表針的某種形狀或幾何形狀,然後應用相關度數的RotateTransform以使針指向正確的值。動畫的To屬性將通過綁定設置爲「值度」屬性。
在我看來,有三種基本方法我可以採取:
使用一個定製FrameworkElement的代表整個計
我可以自FrameworkElement派生,覆蓋其的OnRender方法,那麼使用的DrawingContext繪製量規面和針。這意味着我不能再使用RotateTransform直接對針進行動畫處理,而是每次值改變時都必須重繪整個量表。這對我來說似乎效率低下,因爲量規面代表了大部分的繪圖代碼,但很少會改變。然而,就使用的元素數量而言,這種方法是最輕量的。
使用兩個自定義FrameworkElements,一個用於面部和一個用於針
我目前傾向於這種方式。一個元素代表面部,另一個代表針。這將允許我使用RotateTransform定位針元素。然後,量表控件將由三個元素組成:面部,針和一個面板容器來容納它們(即畫布,網格等)。因此三個元素而不是一個,因此不像第一種方法那麼輕量級。
使用DrawingVisuals畫臉和針
我也看到了有關DrawingVisual類,但我有點困惑,爲什麼有人會用這個,而不是從FrameworkElement的和壓倒一切的OnRender派生,因爲DrawingVisual必須在自定義FrameworkElement中進行託管。看起來這種方法與第二種方法相比沒有任何優勢,並且需要更多的代碼,但也許我錯過了一些東西。
有關人們認爲最好的方法的任何想法或建議,爲什麼會非常歡迎!
根據我的標準,這是最好的方法。由於種種原因(主要是我迄今缺乏WPF經驗),我無法以這種方式編寫控制,所以最終我實際上採用了方法1。 – 2009-05-11 08:19:41