2009-04-23 23 views
1

我需要在WPF中爲工作項目編寫一個計量器控件。通過儀表控制,我的意思是類似於傳統汽車車速表的東西:圓周上有數字和刻度的圓形面,以及指向當前值的指針。雖然我可以讓我的僱主購買第三方控件,甚至在某處找到免費的控件,但我仍然喜歡自己寫這個控件,因爲好奇心比其他任何東西都要好。在WPF中編寫自定義厚度控件的最佳方式?

我的第一個想法是使用模板「皮膚」現有控件,例如ProgressBar,因爲它具有Minimum,Maximum和Value屬性。但是,我認爲這不會爲我提供所需的靈活性。

我想動畫指向當前值的指針,以便當指針值改變時指針從舊值移動到新值。我認爲最簡單的方法是使用代表針的某種形狀或幾何形狀,然後應用相關度數的RotateTransform以使針指向正確的值。動畫的To屬性將通過綁定設置爲「值度」屬性。

在我看來,有三種基本方法我可以採取:

使用一個定製FrameworkElement的代表整個計
我可以自FrameworkElement派生,覆蓋其的OnRender方法,那麼使用的DrawingContext繪製量規面和針。這意味着我不能再使用RotateTransform直接對針進行動畫處理,而是每次值改變時都必須重繪整個量表。這對我來說似乎效率低下,因爲量規面代表了大部分的繪圖代碼,但很少會改變。然而,就使用的元素數量而言,這種方法是最輕量的。

使用兩個自定義FrameworkElements,一個用於面部和一個用於針
我目前傾向於這種方式。一個元素代表面部,另一個代表針。這將允許我使用RotateTransform定位針元素。然後,量表控件將由三個元素組成:面部,針和一個面板容器來容納它們(即畫布,網格等)。因此三個元素而不是一個,因此不像第一種方法那麼輕量級。

使用DrawingVisuals畫臉和針
我也看到了有關DrawingVisual類,但我有點困惑,爲什麼有人會用這個,而不是從FrameworkElement的和壓倒一切的OnRender派生,因爲DrawingVisual必須在自定義FrameworkElement中進行託管。看起來這種方法與第二種方法相比沒有任何優勢,並且需要更多的代碼,但也許我錯過了一些東西。

有關人們認爲最好的方法的任何想法或建議,爲什麼會非常歡迎!

回答

1

我個人建議使用第二種方法制作CustomControl。除非您同時要顯示超過1000個測量儀,否則您不會注意到視覺樹中的額外元素,並且我認爲您會發現製作和維護起來要容易得多。

+0

根據我的標準,這是最好的方法。由於種種原因(主要是我迄今缺乏WPF經驗),我無法以這種方式編寫控制,所以最終我實際上採用了方法1。 – 2009-05-11 08:19:41

1

您可以設置滑塊控件的樣式並向其中添加值。您應該能夠使滑塊看起來像您需要的任何類型的計量器。

+0

雖然這在某些情況下會起作用,但根據我的要求(這也許我應該在問題中予以澄清),這不是我可以使用的方法。儀表的刻度需要變化(即最小/最大範圍和分割數量會改變),另外我還需要其他屬性來表示儀表上的彩色範圍等。我不相信我只通過設計一種現存的控制手段就能實現這一點。我看不出在標記中表現類似的方式。 – 2009-05-11 08:31:50