Как использовать строковые значения вместо галочек на тикбаре WPF? - PullRequest
9 голосов
/ 26 августа 2010

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 26 августа 2010

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

Переопределение 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)); 
        }
    }
}
1 голос
/ 26 августа 2010

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

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

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

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

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

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

0 голосов
/ 03 января 2017
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));
        }

    }
}
...