12
votes

Comment utiliser des valeurs de chaîne à la place des ticks sur la barre de tick WPF?

Je souhaite personnaliser l'apparence du WPF de base tickbar . Je me demandais s'il y avait un moyen simple de faire cela à l'aide d'un modèle de contrôle:

Je souhaite avoir des chiffres à la place des tiques le long de la barre de ticket. Je veux que la position du nombre correspondre à la valeur d'un curseur (un peu comme l'image dans le lien).

J'ai cherché autour de moi et une suggestion que j'ai trouvée a dit de créer une classe qui hérite de tickbar et de remplacer son tinrender méthode.

Je préférerais beaucoup trouver une solution qui n'implique pas cela. J'espérais vraiment que l'utilisation d'un modèle de contrôle ferait le tour. Donc, s'il y a une telle solution, des suggestions seraient grandement appréciées! :)


0 commentaires

3 Réponses :


1
votes

Voici 2 solutions rapides et faciles qui font le travail mais ne doivent pas être considérées comme des meilleures pratiques:

Un correctif super rapide serait de définir la propriété AutotooltiPplacemant sur le curseur sur townright. Cela signifie que les numéros apparaîtront dans une info-bulle lorsque vous faites glisser le curseur.

Option 2 consiste à éditer une copie du modèle de contrôle texte alt

Créez simplement quelques textblock S avec vos valeurs. Cette méthode est incroyablement Ramshakle et que vous ne devez l'utiliser que si vous souhaitez utiliser le curseur spécial une fois. De plus, les numéros ne mettent pas à jour si vous modifiez les propriétés maximales et minimales sur le curseur.

Il y a un moyen approprié de résoudre ce problème, mais si vous en avez besoin de cela rapidement et que vous ne pouvez pas vous inquiéter de commencer à remplacer l'onRender ou de faire une nouvelle commande de ces manières d'obtenir le travail plus rapidement.

(L'auteur de ce poste de réponse ne présente aucunement à l'indigence de pratiques de codage sleazy ou n'utilisez pas ces techniques comme substitut de la manière appropriée de le faire dans son logiciel: ils ne sont que des corrections rapides): -)


1 commentaires

Merci pour les suggestions. Bien que je pense que je vais les éviter pour le moment. :) On dirait que onRender est la meilleure option.



17
votes

D'accord, j'ai une solution. Je pensais que je devrais répondre à ma question dans l'événement, certains autres membres du long de la ligne courent dans la même situation que moi.: -)

Supprimer OnRender semble être la solution la plus évidente. J'espérais vraiment utiliser un modèle de tri ... soupir ... ah bien. Quoi qu'il en soit, j'ai couru sur Cette discussion sur les forums de MSDN qui ont fourni une réponse à m'envoyer dans la bonne direction.

simple, et il a besoin de quelques têtes pour le rendre plus flexible, voici ma version: xxx


1 commentaires

Explication de la raison pour laquelle onRender est mon meilleur pari: social.msdn.microsoft.com/forums/en-us/wpf/thread/... Fondamentalement, TickBar utilise le bas niveau OnRender mécanisme de présentation de ses visuels.



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

    }
}

0 commentaires