【问题标题】:Render numbers for tick on a WPF Slider using TextBox使用 TextBox 在 WPF 滑块上呈现刻度数字
【发布时间】:2014-12-02 22:02:43
【问题描述】:

之前有几个问题与向 WPF Slider 上的刻度添加数值有关(例如 herehere)。到目前为止,我发现的所有建议的解决方案都是从 TickBar 类继承,然后使用 DrawText(FormattedText text, Point point) 来绘制值。比如:

protected override void OnRender(DrawingContext dc)
{
   foreach(double tick in Ticks)
   {
      formattedText = new FormattedText(Convert.ToString(tick),
                                       CultureInfo.GetCultureInfo("en-us"),
                                       FlowDirection.LeftToRight,
                                       new Typeface("Verdana"), // I don't know why all examples use the Verdana font :P
                                       10, Brushes.Black);
      dc.DrawText(formattedText, ComputeTheRightPosition(tick));
   }
}

虽然这是一个有效的解决方案,但由于FormattedText,我发现它对我来说不够通用。在我的应用程序中,Style 可以在运行时更改,所以我更喜欢将所有数字放在TextBlock 或其他东西中的方法,它可以动态更新其样式和字体等等。

是否可以在SliderTickBar 子类中以这种方式添加文本框?

【问题讨论】:

  • 如果你提供一个新的ControlTemplate,你可以添加任何你喜欢的东西。
  • 很遗憾TickBar 不是控件,因此我们不能为其使用任何模板。除非您修改 Slider 本身的模板并将 TickBar 替换为您的自定义 TickBar。
  • 这似乎正是问题所在:我无法为TickBar 制作控制模板。 @KingKing:你知道一个符合你建议的例子吗?因为我根本找不到任何关于如何修改 TickBar 模板的示例或解释,更不用说如何修改刻度以使其显示在文本框中了。
  • 抱歉,我没有创建任何自定义 TickBar(我对默认的 TickBar 几乎满意)。您可以创建一些继承自 TickBar 的自定义类,或者将 TickBar(在 Slider 的模板中)替换为其他一些控件。我将使用ItemsControl,然后将ItemsSource 绑定到SliderTicks 集合。您需要一个 Convert 来将该 DoubleCollection 转换为诸如 TextBox 集合。通常,每次 Ticks 集合更改时,都会更新此 TextBox 集合。无论如何做这样的事情都会有一些糟糕的表现。

标签: c# wpf xaml slider


【解决方案1】:

开箱即用的解决方案 -

在滑块上方放置一个画布。当滑块值发生变化时,得到一个值/(max-min)的比率

使用相同的比例,使用 SetLeft 或 Render Transform 将文本块放置在画布中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多