Как использовать строковые значения вместо тиков на WPF Tickbar?

Я хочу настроить внешний вид базового WPF TickBar. Мне было интересно, есть ли простой способ сделать это с помощью шаблона управления:

Я хотел бы иметь номера в месте засечек вдоль tickbar. Я хочу, чтобы позиция числа соответствовала значению слайдера (как и изображение в ссылке).

Я искал вокруг и одно предложение, которое я нашел, сказал, чтобы создать класс, который наследуется от TickBar и переопределить это OnRender метод.

Я бы предпочел найти решение, которое не связано с этим. Я действительно надеялся, что использование шаблона управления сделает трюк. Итак, если есть одно такое решение, предложения будут очень признательны! :)

3 ответов


ладно, у меня есть решение. Я решил, что должен ответить на мой вопрос, если какой-то другой парень по линии столкнется с той же ситуацией, что и я: -)

переопределить OnRender кажется наиболее очевидным решением. Я действительно надеялся использовать шаблон...вздох ...Ну что ж. В любом случае, я наткнулся эта дискуссия на форумах MSDN, которые предоставили ответ, чтобы отправить меня в правильном направлении.

простой, и это нужно несколько твики, чтобы сделать его более гибким, так что вот моя версия:

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

вот 2 быстрых и простых решения, которые выполняют эту работу, но не должны считаться лучшими практиками:

супер быстрым решением было бы установить свойство AutoToolTipPlacemant на слайдере в TopRight. Это означает, что цифры будут отображаться во всплывающей подсказке при перетаскивании ползунка.

Вариант 2-редактировать копию шаблона элемента управленияalt text

и просто создайте несколько TextBlocks с вашими значениями. Этот метод невероятно Ветхий, и вы должны использовать его только если вы хотите использовать специальный слайдер один раз. Также номера не будут обновляться, если вы измените максимальные и минимальные свойства на слайдере.

существует правильный способ решения этой проблемы, но если вам нужно это сделать быстро и не может быть потрудился, чтобы начать переопределение OnRender или сделать совершенно новый контроль эти способы сделают работу быстрее.

(автор этого сообщения ответа никоим образом не использует грязные методы кодирования или использует эти методы в качестве замены для правильного способа сделать это в своем программном обеспечении: они просто быстрые исправления): -)


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

    }
}