public
class
SliderToolTipExtensions : DependencyObject
{
private
static
string
SingleThumbName =
"SingleThumbHost"
;
private
static
string
RangeStartThumb =
"RangeStartThumb"
;
private
static
string
RangeEndThumb =
"RangeEndThumb"
;
private
static
string
ValuePropertyPath =
"Value"
;
private
static
string
SelectionStartPropertyPath =
"SelectionStart"
;
private
static
string
SelectionEndPropertyPath =
"SelectionEnd"
;
public
static
readonly
DependencyProperty IsToolTipEnabledProperty =
DependencyProperty.RegisterAttached(
"IsToolTipEnabled"
,
typeof
(
bool
),
typeof
(RadSlider),
new
PropertyMetadata(
false
, OnIsToolTipEnabledChanged));
public
static
readonly
DependencyProperty ToolTipProperty =
DependencyProperty.RegisterAttached(
"ToolTip"
,
typeof
(ToolTip),
typeof
(RadSlider),
new
PropertyMetadata(
null
));
public
static
readonly
DependencyProperty ToolTipContextProperty =
DependencyProperty.RegisterAttached(
"ToolTipContext"
,
typeof
(
object
),
typeof
(RadSlider),
new
PropertyMetadata(
null
));
/// <summary>
/// Gets the IsToolTipEnabled attached property.
/// </summary>
public
static
bool
GetIsToolTipEnabled(DependencyObject obj)
{
return
(
bool
)obj.GetValue(IsToolTipEnabledProperty);
}
/// <summary>
/// Sets the IsToolTipEnabled attached property.
/// </summary>
public
static
void
SetIsToolTipEnabled(DependencyObject obj,
bool
value)
{
obj.SetValue(IsToolTipEnabledProperty, value);
}
/// <summary>
/// Gets the TooTip attached property.
/// </summary>
public
static
ToolTip GetToolTip(DependencyObject obj)
{
return
(ToolTip)obj.GetValue(ToolTipProperty);
}
/// <summary>
/// Sets the ToolTip attached property.
/// </summary>
public
static
void
SetToolTip(DependencyObject obj, ToolTip value)
{
obj.SetValue(ToolTipProperty, value);
}
/// <summary>
/// Gets the ToolTipContext attached property.
/// </summary>
public
static
object
GetToolTipContext(DependencyObject obj)
{
return
obj.GetValue(ToolTipContextProperty);
}
/// <summary>
/// Sets the ToolTipContext attached property.
/// </summary>
public
static
void
SetToolTipContext(DependencyObject obj,
object
value)
{
obj.SetValue(ToolTipContextProperty, value);
}
/// <summary>
/// Called when RadSlider's DragCompleted event is raised.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="Telerik.Windows.Controls.RadDragCompletedEventArgs" /> instance containing the event data.</param>
private
static
void
OnSliderDragCompleted(
object
sender, RadDragCompletedEventArgs e)
{
RadSlider slider = sender
as
RadSlider;
if
(slider !=
null
)
{
SliderToolTipExtensions.CloseToolTips(slider);
}
}
/// <summary>
/// Called when RadSlider changes its Value property.
/// </summary>
private
static
void
OnSliderValueChanged(
object
sender, RoutedPropertyChangedEventArgs<
double
> e)
{
RadSlider slider = sender
as
RadSlider;
if
(slider !=
null
)
{
CreateToolTip(slider, ValuePropertyPath, SingleThumbName);
}
}
/// <summary>
/// Called when RadSlider changes its SelectionStart property.
/// </summary>
private
static
void
OnSliderSelectionStartChanged(
object
sender, RoutedPropertyChangedEventArgs<
double
> e)
{
RadSlider slider = sender
as
RadSlider;
if
(slider !=
null
)
{
CreateToolTip(slider, SelectionStartPropertyPath, RangeStartThumb);
}
}
/// <summary>
/// Called when RadSlider changes its SelectionEnd property.
/// </summary>
private
static
void
OnSliderSelectionEndChanged(
object
sender, RoutedPropertyChangedEventArgs<
double
> e)
{
RadSlider slider = sender
as
RadSlider;
if
(slider !=
null
)
{
CreateToolTip(slider, SelectionEndPropertyPath, RangeEndThumb);
}
}
/// <summary>
/// Sets the ToolTip DataContext.
/// </summary>
private
static
void
SetToolTipDataContext(FrameworkElement target, RadSlider owner,
string
propertyPath)
{
if
(target.GetBindingExpression(FrameworkElement.DataContextProperty) ==
null
)
{
target.SetBinding(FrameworkElement.DataContextProperty,
new
System.Windows.Data.Binding()
{
Source = owner,
Path =
new
PropertyPath(propertyPath),
Mode = BindingMode.TwoWay
});
}
}
/// <summary>
/// Called when the ToolTip is enabled or disabled.
/// </summary>
private
static
void
OnIsToolTipEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RadSlider slider = d
as
RadSlider;
bool
activate = e.NewValue !=
null
&& (
bool
)e.NewValue;
if
(slider !=
null
)
{
if
(activate)
{
// activate behavior
slider.SelectionStartChanged += OnSliderSelectionStartChanged;
slider.SelectionEndChanged += OnSliderSelectionEndChanged;
slider.ValueChanged += OnSliderValueChanged;
slider.DragCompleted += OnSliderDragCompleted;
}
else
{
// deactivate behavior
slider.ValueChanged -= OnSliderValueChanged;
slider.DragCompleted -= OnSliderDragCompleted;
slider.SelectionStartChanged -= OnSliderSelectionStartChanged;
slider.SelectionEndChanged -= OnSliderSelectionEndChanged;
}
}
}
/// <summary>
/// Gets a specific Thumb from RadSlider's ControlTemplate.
/// </summary>
private
static
Thumb GetThumb(RadSlider slider,
string
thumbName)
{
return
slider.ChildrenOfType<Thumb>().Where(x => x.Name == thumbName).FirstOrDefault();
}
/// <summary>
/// Closes the ToolTips.
/// </summary>
/// <param name="owner">The owner.</param>
private
static
void
CloseToolTips(RadSlider slider)
{
IEnumerable<Thumb> thumbs = slider.ChildrenOfType<Thumb>();
foreach
(Thumb thumb
in
thumbs)
{
ToolTip tooltip = ToolTipService.GetToolTip(thumb)
as
ToolTip;
if
(tooltip !=
null
)
{
// throws exception
// thumb.ClearValue(ToolTipService.ToolTipProperty);
// close the tooltip and prevent it from opening
tooltip.IsOpen =
false
;
tooltip.Visibility = Visibility.Collapsed;
}
}
}
/// <summary>
/// Creates the ToolTip.
/// </summary>
/// <param name="slider">The slider.</param>
/// <param name="propertyPath">The property path.</param>
/// <param name="thumbName">Name of the thumb.</param>
private
static
void
CreateToolTip(RadSlider slider,
string
propertyPath,
string
thumbName)
{
Thumb thumb = SliderToolTipExtensions.GetThumb(slider, thumbName);
if
(thumb !=
null
)
{
thumb.ClearValue(ToolTipService.ToolTipProperty);
ToolTip toolTip = slider.GetValue(SliderToolTipExtensions.ToolTipProperty)
as
ToolTip;
toolTip.ClearValue(FrameworkElement.DataContextProperty);
SliderToolTipExtensions.SetToolTipDataContext(toolTip, slider, propertyPath);
toolTip.PlacementTarget = thumb;
ToolTipService.SetToolTip(thumb, toolTip);
toolTip.IsOpen =
true
;
toolTip.Visibility = Visibility.Visible;
}
}
}
<
telerik:RadSlider
Value
=
"0.4"
TickFrequency
=
"0.1"
TickPlacement
=
"TopLeft"
Margin
=
"0 50"
extensions:SliderToolTipExtensions.IsToolTipEnabled
=
"True"
extensions:SliderToolTipExtensions.ToolTipContext
=
"{Binding RelativeSource={RelativeSource Self}}"
>
<
extensions:SliderToolTipExtensions.ToolTip
>
<
ToolTip
Placement
=
"Bottom"
>
<
TextBlock
Text
=
"{Binding Path=., StringFormat=n2}"
FontSize
=
"14"
/>
</
ToolTip
>
</
extensions:SliderToolTipExtensions.ToolTip
>
</
telerik:RadSlider
>
<
telerik:RadSlider
SelectionStart
=
"0.4"
SelectionEnd
=
"0.6"
TickFrequency
=
"0.1"
TickPlacement
=
"TopLeft"
Margin
=
"0 50"
IsSelectionRangeEnabled
=
"True"
extensions:SliderToolTipExtensions.IsToolTipEnabled
=
"True"
extensions:SliderToolTipExtensions.ToolTipContext
=
"{Binding RelativeSource={RelativeSource Self}}"
>
<
extensions:SliderToolTipExtensions.ToolTip
>
<
ToolTip
Placement
=
"Bottom"
>
<
TextBlock
Text
=
"{Binding Path=., StringFormat=n2}"
FontSize
=
"14"
/>
</
ToolTip
>
</
extensions:SliderToolTipExtensions.ToolTip
>
</
telerik:RadSlider
>
Hi, I'm Kiril and I'm the Product Manager of Telerik UI for Android, Windows Universal and Windows Phone. Feel free to ping me on +KirilStanoev or @KirilStanoev