我们一起工作,所以我将留下我们找到的解决方案,以防其他人感兴趣。
首先我们创建了 2 个类。
1) 一个继承自 SLIDER 的类,具有 2 个中间范围(图像中的绿色数字)的依赖属性,如下所示:
class NumberedSlider : System.Windows.Controls.Slider
{
public static readonly DependencyProperty RangeMinProperty = DependencyProperty.Register(
"RangeMinSlider", typeof(int), typeof(NumberedTickBar), new FrameworkPropertyMetadata(0));
public int RangeMin
{
get { return (int)base.GetValue(RangeMinProperty); }
set { base.SetValue(RangeMinProperty, value); }
}
public static readonly DependencyProperty RangeMaxProperty = DependencyProperty.Register(
"RangeMaxSlider", typeof(int), typeof(NumberedTickBar), new FrameworkPropertyMetadata(0));
public int RangeMax
{
get { return (int)base.GetValue(RangeMaxProperty); }
set { base.SetValue(RangeMaxProperty, value); }
}
}
2) 滑块 TickBar 的类,它将呈现数字:
public class NumberedTickBar : TickBar
{
public static readonly DependencyProperty RangeMinProperty = DependencyProperty.Register(
"RangeMin", typeof (int), typeof (NumberedTickBar), new FrameworkPropertyMetadata(0));
public int RangeMin
{
get { return (int) base.GetValue(RangeMinProperty); }
set { base.SetValue(RangeMinProperty, value); }
}
public static readonly DependencyProperty RangeMaxProperty = DependencyProperty.Register(
"RangeMax", typeof (int), typeof (NumberedTickBar), new FrameworkPropertyMetadata(0));
public int RangeMax
{
get { return (int) base.GetValue(RangeMaxProperty); }
set { base.SetValue(RangeMaxProperty, value); }
}
protected override void OnRender(DrawingContext dc)
{
Size size = new Size(base.ActualWidth, base.ActualHeight);
int tickCount;
if ((this.Maximum - this.Minimum)%this.TickFrequency == 0)
tickCount = (int) ((this.Maximum - this.Minimum)/this.TickFrequency);
else
tickCount = (int) ((this.Maximum - this.Minimum)/this.TickFrequency) + 1;
double tickFrequencySize = (size.Height*this.TickFrequency/(this.Maximum - this.Minimum));
// Draw each tick text
for (int i = 0; i <= tickCount; i++)
{
int value = Convert.ToInt32(this.Minimum + this.TickFrequency*i);
string text = Convert.ToString(value, 10);
FormattedText formattedText;
if (value >= this.RangeMin && value <= this.RangeMax)
formattedText = new FormattedText(text, CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight, new Typeface("Arial Rounded MT Bold"), 16,
Brushes.Green);
else
formattedText = new FormattedText(text, CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight, new Typeface("Arial Rounded MT Bold"), 16,
Brushes.DarkBlue);
dc.DrawText(formattedText, new Point(30, (tickFrequencySize*(tickCount - i)-6)));
}
}
}
然后我们替换了垂直滑块的控制模板上的刻度栏,如下例所示:
股票行情指示器上带有标签的垂直滑块 https://stackoverflow.com/questions/15391127/wpf-vertical-slider-with-labels-on-the-ticker
还添加了依赖属性的 2 个新值:
<common:NumberedTickBar Margin="0,0,0,10" x:Name="TopTick"
SnapsToDevicePixels="True" Placement="Left"
Fill="{StaticResource GlyphBrush}" Width="4"
RangeMax="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RangeMax}"
RangeMin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RangeMin}"/>
最后,在用户控件的 xaml 中,我们有一些如下代码:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
<Grid>
<common:NumberedSlider x:Name="SliderValue" MinHeight="180" Margin="5 15 5 15" Orientation="Vertical"
Maximum="89"
Minimum="77"
Value="{Binding BarValue, Mode=TwoWay}"
TickFrequency="1"
IsSnapToTickEnabled="True"
RangeMin="82"
RangeMax="85"
IsEnabled="{Binding SliderEnabled}"/>
</Grid>
<Grid Grid.Column="1">
<ProgressBar Orientation="Vertical" Width="70"
Minimum="{Binding ElementName=SliderValue,Path=Minimum}"
Maximum="{Binding ElementName=SliderValue,Path=Maximum}"
Value="{Binding ElementName=SliderValue, Path=Value}" Margin="0 14" Background="Gray" MinHeight="200"
Foreground="{Binding ColorBar, Converter= {StaticResource setSteelPointLevelConverter}}" />
</Grid>
</Grid>
希望这种方法可以帮助其他人。