2010-08-26 22 views
9

我想定製基本WPF TickBar的外觀。我想知道是否有一個簡單的方法來使用控制模板來做到這一點:如何使用字符串值代替WPF TickBick上的ticks?

我希望有數字來代替滴答杆上的滴答。我希望數字的位置對應滑塊的值(非常類似於鏈接中的圖片)。

我周圍搜索和一個建議,我發現說創建一個類,繼承TickBar並覆蓋它的OnRender方法。

我寧願找到一個不涉及到的解決方案。我真的希望使用一個控制模板可以做到這一點。所以,如果有一個這樣的解決方案,建議將不勝感激! :)

回答

16

好的,我有一個解決方案。我想我應該回答我的問題,如果沿線的一些其他人遇到與我一樣的情況。:-)

替代OnRender似乎是最明顯的解決方案。我真的很希望能使用各種模板... 感嘆 ......好啊。無論如何,我在MSDN的論壇上碰到了this discussion,這些論壇爲我提供了一個正確的方向。

簡單,它需要一些tweeks,使之更加靈活,所以這裏是我的版本:

class CustomTickBar : TickBar 
{ 
    protected override void OnRender(System.Windows.Media.DrawingContext dc) 
    { 
     double num = this.Maximum - this.Minimum; 
     double y = this.ReservedSpace * 0.5; 
     FormattedText formattedText = null; 
     double x = 0; 
     for(double i = 0; i <= num; i += this.TickFrequency) 
     { 
      formattedText = new FormattedText(i.ToString(), FlowDirection.LeftToRight, 
       new Typeface("Verdana"), 8, Brushes.Black); 
      if(this.Minimum == i) 
       x = 0; 
      else 
       x += this.ActualWidth/(num/this.TickFrequency) ; 
      dc.DrawText(formattedText, new Point(x, 10)); 
     } 
    } 
} 
+1

解釋爲什麼'OnRender'是我最好的選擇:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2f4a9b7-18cd-4544-91b1-52dc0b2b93a6 基本上,TickBar使用用於呈現其視覺效果的低級別「OnRender」機制。 – 2010-08-26 20:22:37

1

這裏有兩個快速和容易的解決方案,做的工作,但不應該被視爲最佳做法:

一個超快速的解決將是設置滑塊TopRight的AutoToolTipPlacemant財產。這意味着當您拖動滑塊時,數字將顯示在工具提示中。

選項2是編輯控件模板的副本alt text

,只是在創建幾個TextBlock s的你的價值觀,這種方法是令人難以置信的搖搖欲墜,如果你要使用特殊的,你應該只使用它滑塊一次。如果更改滑塊上的最大和最小屬性,也不會更新數字。

有一個解決這個問題的正確方法,但是如果您需要快速完成並且無法開始重寫OnRender或製作全新控件,這些方法將更快地完成工作。

(這個答案帖子的作者不以任何方式背書單薄的編碼實踐或使用這些技術作爲他的軟件做的正確方法的替代品,它們只是權宜之計):-)

+0

感謝您的建議。儘管如此,我想我現在會避開它們。 :) 看起來像「OnRender」是最好的選擇。 – 2010-08-26 17:50:54

0
public class CustomTickBar:TickBar 
{ 
    protected override void OnRender(DrawingContext dc) 
    { 
     Size size = new Size (base.ActualWidth,base.ActualHeight); 

     int tickCount = (int)((this.Maximum - this.Minimum)/this.TickFrequency)+1; 

     if ((this.Maximum - this.Minimum) % this.TickFrequency == 0) 

      tickCount -= 1; 

     Double tickFrequencySize; 

     // Calculate tick's setting 

     tickFrequencySize = (size.Width * this.TickFrequency/(this.Maximum - this.Minimum)); 

     string text = ""; 

     FormattedText formattedText = null; 

     double num = this.Maximum - this.Minimum; 

     int i = 0; 

     // Draw each tick text 

     for (i = 0;i <= tickCount;i++) 
     { 
      text = Convert.ToString (Convert.ToInt32 (this.Minimum + this.TickFrequency * i),10); 

      //g.DrawString(text, font, brush, drawRect.Left + tickFrequencySize * i, drawRect.Top + drawRect.Height/2, stringFormat); 

      formattedText = new FormattedText (text,CultureInfo.GetCultureInfo ("en-us"),FlowDirection.LeftToRight,new Typeface ("Verdana"),8,Brushes.Black); 

      dc.DrawText (formattedText,new Point ((tickFrequencySize * i),30)); 
     } 

    } 
}