2010-08-26 4 views
9

Desidero personalizzare l'aspetto del WPF base TickBar. Mi chiedevo se esistesse un modo semplice per farlo utilizzando un modello di controllo:Come utilizzare i valori stringa al posto delle zecche sulla barra dei segni di WPF?

Desidero avere numeri al posto delle zecche lungo la barra dei segni. Voglio che la posizione del numero corrisponda al valore di un cursore (molto simile all'immagine nel link).

Ho cercato in giro e un suggerimento ho trovato detto di creare una classe che eredita da TickBar e sovrascrivere è il metodo OnRender.

Preferisco piuttosto trovare una soluzione che non implichi ciò. Speravo davvero che l'utilizzo di un modello di controllo avrebbe funzionato. Quindi, se esiste una soluzione di questo tipo, i suggerimenti sarebbero molto apprezzati! :)

risposta

16

Ok, ho una soluzione. Ho pensato che avrei dovuto rispondere alla mia domanda nel caso in cui un altro collega lungo la linea si trova nella stessa situazione di I. :-)

Override OnRender sembra essere la soluzione più ovvia. Speravo davvero di usare un modello di ... sospiro ... ah bene. Ad ogni modo, ho incontrato this discussion sui forum di MSDN che mi hanno fornito una risposta per inviarmi nella giusta direzione.

semplice, e hanno bisogno di un paio di tweeks per renderlo più flessibile, quindi ecco la mia versione:

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

Spiegazione sul motivo per cui "OnRender" è la mia migliore scommessa: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2f4a9b7-18cd-4544-91b1-52dc0b2b93a6 Fondamentalmente, TickBar utilizza il meccanismo "OnRender" di basso livello per presentare le sue immagini. –

1

Qui ci sono 2 soluzioni rapide e facili che fanno il lavoro, ma non dovrebbero essere considerati buone pratiche:

Una correzione super veloce sarebbe quella di impostare la proprietà AutoToolTipPlacemant sul cursore a Discutiamone. Ciò significa che i numeri verranno visualizzati in un suggerimento quando si trascina il cursore.

opzione 2 è quello di modificare una copia del modello di controllo alt text

e basta creare un paio di TextBlock s con i vostri valori. Questo metodo è incredibilmente sgangherato e si dovrebbe utilizzare solo se si desidera utilizzare lo speciale cursore una volta. Inoltre, i numeri non vengono aggiornati se si modificano le proprietà Massimo e Minimo sul dispositivo di scorrimento.

Esiste un modo corretto per risolvere questo problema, ma se è necessario farlo rapidamente e non si può preoccupare di iniziare a sovrascrivere OnRender o di eseguire un controllo completamente nuovo, questi metodi faranno il lavoro più rapidamente.

(l'autore di questo post risposta non in alcun modo avallare codifica pratiche o utilizzare queste tecniche come sostituto per il corretto modo di fare nel suo software squallidi: sono correzioni rapide solo) :-)

+0

grazie per i suggerimenti. Anche se, penso che li eviterò per ora. :) Sembra che "OnRender" sia l'opzione migliore. –

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

    } 
}