2010-08-26 22 views
9

Tôi muốn tùy chỉnh giao diện của WPF TickBar cơ bản. Tôi đã tự hỏi nếu có một cách đơn giản để làm điều này bằng cách sử dụng mẫu kiểm soát:Làm thế nào để sử dụng các giá trị chuỗi thay cho dấu tick trên thanh ghi WPF?

Tôi muốn có số ở vị trí của bọ ve dọc theo vạch tích. Tôi muốn vị trí của số tương ứng với giá trị của một thanh trượt (giống như hình ảnh trong liên kết).

Tôi đã tìm kiếm xung quanh và một đề xuất mà tôi đã tìm thấy để tạo lớp kế thừa từ TickBar và ghi đè phương thức OnRender.

Tôi muốn tìm một giải pháp không liên quan đến điều đó. Tôi đã thực sự hy vọng bằng cách sử dụng một mẫu kiểm soát sẽ làm các trick. Vì vậy, nếu có một giải pháp như vậy, đề xuất sẽ được đánh giá rất nhiều! :)

Trả lời

16

Được rồi, tôi có một giải pháp. Tôi nghĩ rằng tôi nên trả lời câu hỏi của tôi trong trường hợp một số người khác dọc theo đường chạy vào tình huống tương tự như I. :-)

Ghi đè OnRender có vẻ là giải pháp rõ ràng nhất. Tôi thực sự hy vọng sẽ sử dụng một mẫu các loại ... thở dài ... à. Dù sao, tôi chạy qua this discussion trên diễn đàn MSDN cung cấp một câu trả lời để gửi cho tôi đi đúng hướng.

đơn giản, và nó cần một vài tweeks để làm cho nó linh hoạt hơn, vì vậy đây là phiên bản của tôi:

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

Giải thích tại sao 'OnRender' là cược tốt nhất của tôi: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2f4a9b7-18cd-4544-91b1-52dc0b2b93a6 Về cơ bản, TickBar sử dụng cơ chế 'OnRender' cấp thấp để trình bày hình ảnh của nó. –

1

Dưới đây là 2 giải pháp nhanh chóng và dễ dàng mà thực hiện công việc nhưng không nên được coi là thực hành tốt nhất:

Một sửa chữa siêu nhanh sẽ được thiết lập thuộc tính AutoToolTipPlacemant trên thanh trượt để topright. Điều này có nghĩa là số sẽ hiển thị trong chú giải công cụ khi bạn kéo thanh trượt.

Lựa chọn 2 là để chỉnh sửa một bản sao của mẫu kiểm soát alt text

và chỉ cần tạo một vài TextBlock s với giá trị của bạn trong. Phương pháp này là vô cùng xiêu vẹo và bạn chỉ nên sử dụng nó nếu bạn muốn sử dụng đặc biệt trượt một lần. Ngoài ra các con số sẽ không cập nhật nếu bạn thay đổi các thuộc tính tối đa và tối thiểu trên thanh trượt.

Có cách thích hợp để giải quyết vấn đề này nhưng nếu bạn cần thực hiện nhanh chóng và không thể làm phiền để bắt đầu ghi đè OnRender hoặc kiểm soát hoàn toàn những cách này sẽ thực hiện công việc nhanh hơn.

(tác giả của câu trả lời bài này không không có cách nào chuyển nhượng nhếch nhác thực hành mã hóa hoặc sử dụng những kỹ thuật này như một sự thay thế cho cách thích hợp để làm việc đó trong phần mềm của mình: họ chỉ là nhanh chóng sửa chữa) :-)

+0

nhờ những lời đề nghị. Mặc dù, tôi nghĩ tôi sẽ tránh chúng ngay bây giờ. :) Có vẻ như 'OnRender' là lựa chọn tốt nhất. –

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)); 
     } 

    } 
}