【问题标题】:How to use string values in place of ticks on WPF Tickbar?如何使用字符串值代替 WPF Tickbar 上的刻度?
【发布时间】:2010-08-26 17:09:37
【问题描述】:

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

我希望用数字代替刻度条上的刻度。我希望数字的位置与滑块的值相对应(很像链接中的图片)。

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

我宁愿找到一个不涉及该问题的解决方案。我真的希望使用控制模板可以解决问题。因此,如果有这样的解决方案,我们将不胜感激! :)

【问题讨论】:

    标签: .net wpf slider wpf-controls


    【解决方案1】:

    好的,我有一个解决方案。我想我应该回答我的问题,以防其他人遇到和我一样的情况。:-)

    覆盖OnRender 似乎是最明显的解决方案。我真的很希望使用某种模板...sigh ...嗯。无论如何,我在 MSDN 的论坛上遇到了this discussion,它提供了一个答案,让我朝着正确的方向前进。

    简单,但需要几个星期才能使其更灵活,所以这是我的版本:

    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】:

    这里有 2 种快速简便的解决方案可以完成这项工作,但不应被视为最佳做法:

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

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

    只需创建几个TextBlocks 并包含您的值。这种方法非常不稳定,只有在您想使用特殊滑块一次时才应该使用它。如果您更改滑块上的最大值和最小值属性,数字也不会更新。

    有一种解决此问题的适当方法,但如果您需要快速完成,并且不想开始覆盖 OnRender 或制作全新的控件,这些方法将更快地完成工作。

    (这篇回答文章的作者绝不支持低俗的编码实践或使用这些技术来代替在他的软件中正确的做法:它们只是快速修复):-)

    【讨论】:

    • 感谢您的建议。虽然,我想我现在会避开它们。 :) 看起来OnRender 是最好的选择。
    【解决方案3】:
    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));
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2016-12-30
      相关资源
      最近更新 更多