.net 如何使用字符串值代替WPF Tickbar上的记号?

.net 如何使用字符串值代替WPF Tickbar上的记号?,.net,wpf,slider,wpf-controls,.net,Wpf,Slider,Wpf Controls,我希望自定义基本WPF的外观。我想知道是否有一种使用控件模板的简单方法: 我希望用数字代替记号条上的记号。我希望数字的位置与滑块的值相对应(与链接中的图片非常相似) 我四处搜索,发现一个建议是创建一个继承自TickBar的类,并重写它的OnRender方法 我宁愿找到一个不涉及这一点的解决方案。我真的希望使用一个控件模板可以达到这个目的。因此,如果有这样的解决方案,我们将不胜感激 这里有两个简单快捷的解决方案,可以完成这项工作,但不应被视为最佳实践: 一个超级快速的修复方法是将滑块上的AutoT

我希望自定义基本WPF的外观。我想知道是否有一种使用控件模板的简单方法:

我希望用数字代替记号条上的记号。我希望数字的位置与滑块的值相对应(与链接中的图片非常相似)

我四处搜索,发现一个建议是创建一个继承自
TickBar
的类,并重写它的
OnRender
方法


我宁愿找到一个不涉及这一点的解决方案。我真的希望使用一个控件模板可以达到这个目的。因此,如果有这样的解决方案,我们将不胜感激

这里有两个简单快捷的解决方案,可以完成这项工作,但不应被视为最佳实践:

一个超级快速的修复方法是将滑块上的AutoToolTipPlacemant属性设置为右上角。这意味着拖动滑块时,数字将显示在工具提示中

选项2是编辑控件模板的副本

只需创建几个
TextBlock
s,其中包含您的值。这种方法是令人难以置信的摇摇欲坠,你应该只使用它,如果你想使用特殊的滑块一次。此外,如果更改滑块上的“最大”和“最小”属性,则数字不会更新

有一种解决此问题的正确方法,但是如果您需要快速完成此任务,并且不必费心开始重写OnRender或创建一个全新的控件,这些方法将更快地完成此任务


(这篇回答文章的作者决不支持低级的编码实践,也不使用这些技术来替代他的软件中正确的编码方式:它们只是快速修复):-)

好的,我有一个解决方案。我想我应该回答我的问题,以防其他同行遇到与我相同的情况

覆盖
OnRender
似乎是最明显的解决方案。我真的希望使用某种模板……唉……好吧。不管怎样,我在MSDN的论坛上偶然发现了一个答案,让我找到了正确的方向

简单,并且需要一些tweek使其更加灵活,因此我的版本如下:

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)); 
        }
    }
}
class CustomTickBar:TickBar
{
受保护的覆盖无效OnRender(System.Windows.Media.DrawingContext dc)
{
double num=此.Maximum-此.Minimum;
双y=this.ReservedSpace*0.5;
FormattedText FormattedText=null;
双x=0;
对于(双i=0;i
public类CustomTickBar:TickBar
{
受保护的覆盖无效OnRender(DrawingContext dc)
{
尺寸尺寸=新尺寸(基准.实际宽度,基准.实际高度);
int tickCount=(int)((this.Maximum-this.Minimum)/this.TickFrequency)+1;
如果((this.Maximum-this.Minimum)%this.TickFrequency==0)
滴答数-=1;
双频大小;
//计算滴答声的设置
tickFrequencySize=(size.Width*this.TickFrequency/(this.Maximum-this.Minimum));
字符串文本=”;
FormattedText FormattedText=null;
double num=此.Maximum-此.Minimum;
int i=0;
//绘制每个勾号文本

对于(i=0;我感谢您的建议。不过,我想现在我会避免使用它们。:)看起来
OnRender
是最好的选择。解释为什么
OnRender
是我最好的选择:基本上,TickBar使用低级
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));
        }

    }
}