我希望自定义基本WPF TickBar
的外观。我想知道是否有一种简单的方法可以使用控件模板:
我希望用数字代替标记栏上的刻度。我希望数字的位置对应于滑块的值(很像链接中的图片)。
我已经搜索了一个建议,我发现创建了一个继承自TickBar
的类并覆盖它的OnRender
方法。
我宁愿找到一个不涉及的解决方案。我真的希望使用控件模板来做到这一点。所以,如果有一个这样的解决方案,建议将不胜感激! :)
答案 0 :(得分:16)
好的,我有一个解决方案。我想我应该回答我的问题,因为沿线的其他人遇到与我相同的情况: - )
覆盖OnRender
似乎是最明显的解决方案。我真的希望使用各种模板...... 叹息 ......啊。无论如何,我在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));
}
}
}
答案 1 :(得分:1)
以下是2种快速简便的解决方案,可以完成这项工作但不应被视为最佳实践:
超快速解决方法是将滑块上的AutoToolTipPlacemant属性设置为TopRight。这意味着当您拖动滑块时,数字将显示在工具提示中。
选项2是编辑控件模板
只需使用您的值创建一些TextBlock
。此方法令人难以置信的摇摇欲坠,如果您想使用特殊滑块一次,则应该只使用它。如果更改滑块上的“最大”和“最小”属性,则数字也不会更新。
有一种解决这个问题的正确方法,但如果您需要快速完成并且无法开始重写OnRender或进行全新控制,这些方法可以更快地完成工作。
(这篇答案文章的作者绝不是拙劣的低级编码实践或使用这些技术代替在他的软件中正确的方法:它们只是快速修复): - )
答案 2 :(得分:0)
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));
}
}
}