2010-08-26 7 views
9

Deseo personalizar el aspecto del WPF básico TickBar. Me preguntaba si había una manera simple de hacer esto usando una plantilla de control:¿Cómo utilizar valores de cadena en lugar de ticks en WPF Tickbar?

Deseo tener números en lugar de tics en la barra de tilde. Quiero que la posición del número corresponda al valor de un control deslizante (muy parecido a la imagen en el enlace).

He buscado y una sugerencia que encontré dijo crear una clase que hereda de TickBar y anular su método OnRender.

Prefiero encontrar una solución que no implique eso. Realmente estaba esperando usar una plantilla de control que hiciera el truco. Entonces, si hay una de esas soluciones, ¡las sugerencias serán muy apreciadas! :)

Respuesta

16

De acuerdo, tengo una solución. Pensé que debería responder mi pregunta en caso de que algún otro compañero a lo largo de la línea se encuentre en la misma situación que yo :-)

Alterar OnRender parece ser la solución más obvia. Realmente estaba esperando usar una especie de plantilla ... suspiro ... ah bien. De todos modos, me encontré con this discussion en los foros de MSDN que me dieron una respuesta para enviarme en la dirección correcta.

simple, y lo necesitan unos cuantos arreglos para que sea más flexible, así que aquí está mi versión:

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

Explicación de por qué 'OnRender' es mi mejor opción: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2f4a9b7-18cd-4544-91b1-52dc0b2b93a6 Básicamente, TickBar utiliza el mecanismo de bajo nivel 'OnRender' para presentar sus visuales. –

1

Aquí hay 2 soluciones rápidas y fáciles que hacen el trabajo, pero no deben ser considerados mejores prácticas:

Una solución muy rápida sería la de establecer la propiedad AutoToolTipPlacemant en el control deslizante para topright. Esto significa que los números se mostrarán en una información sobre herramientas cuando arrastre el control deslizante.

Opción 2 es editar una copia de la plantilla de control alt text

y simplemente crear unos TextBlock s con sus valores. Este método es muy destartalada y sólo se debe utilizar si desea utilizar el especial deslizador una vez. Además, los números no se actualizarán si cambia las propiedades Máxima y Mínima en el control deslizante.

Hay una forma adecuada de resolver este problema, pero si lo necesita de manera rápida y no se puede molestar en comenzar a anular OnRender o hacer un control completamente nuevo, estas formas harán el trabajo más rápidamente.

(el autor de este post respuesta hace de ninguna manera indorse de mala calidad prácticas de codificación o utilizar estas técnicas como un sustituto de la forma correcta de hacerlo en su software: son simplemente correcciones rápidas) :-)

+0

gracias por las sugerencias. Aunque creo que los evitaré por ahora. :) Parece que 'OnRender' es la mejor opción. –

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

    } 
} 
Cuestiones relacionadas