【发布时间】:2014-12-02 22:02:43
【问题描述】:
之前有几个问题与向 WPF Slider 上的刻度添加数值有关(例如 here 和 here)。到目前为止,我发现的所有建议的解决方案都是从 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 或其他东西中的方法,它可以动态更新其样式和字体等等。
是否可以在Slider 或TickBar 子类中以这种方式添加文本框?
【问题讨论】:
-
如果你提供一个新的
ControlTemplate,你可以添加任何你喜欢的东西。 -
很遗憾
TickBar不是控件,因此我们不能为其使用任何模板。除非您修改 Slider 本身的模板并将 TickBar 替换为您的自定义 TickBar。 -
这似乎正是问题所在:我无法为
TickBar制作控制模板。 @KingKing:你知道一个符合你建议的例子吗?因为我根本找不到任何关于如何修改TickBar模板的示例或解释,更不用说如何修改刻度以使其显示在文本框中了。 -
抱歉,我没有创建任何自定义 TickBar(我对默认的 TickBar 几乎满意)。您可以创建一些继承自
TickBar的自定义类,或者将 TickBar(在 Slider 的模板中)替换为其他一些控件。我将使用ItemsControl,然后将ItemsSource绑定到Slider的Ticks集合。您需要一个 Convert 来将该 DoubleCollection 转换为诸如 TextBox 集合。通常,每次 Ticks 集合更改时,都会更新此 TextBox 集合。无论如何做这样的事情都会有一些糟糕的表现。