/// <summary> /// Invoked when the effective property value of the ViewValue property changes. /// </summary> /// <param name="dependencyObject">The DependencyObject on which the property has changed value.</param> /// <param name="dependencyPropertyChangedEventArgs">Event data that is issued by any event that tracks changes to the effective value of this /// property.</param> static void OnValuePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) { // Adjust the slider position to reflect the current integral Value using the mapping for the ticks on the slider. ViewSlider viewSlider = dependencyObject as ViewSlider; if (viewSlider.Value != Int32.MinValue) { ((Slider)viewSlider).Value = ViewSlider.smallTicks[viewSlider.Value]; } }
/// <summary> /// Called whenever a dependency property value is being re-evaluated, or coercion is specifically requested. /// </summary> /// <param name="dependencyObject">The object that the property exists on. When the callback is invoked, the property system will pass this value.</param> /// <param name="baseValue">The new value of the property, prior to any coercion attempt.</param> /// <returns>The coerced value (with appropriate type).</returns> static Object CoerceValuePropertyCallback(DependencyObject dependencyObject, Object baseValue) { // Extract the slider and the new value from the generic parameters. ViewSlider viewSlider = dependencyObject as ViewSlider; Double newValue = (Double)baseValue; // When the mouse is used to move the thumb it will snap into place when it is close to an integral view. This provides the snapping logic that moves // the mouse to an integral position on the slider when it gets close to that value. if (!viewSlider.inhibitSnap) { foreach (Range range in ViewSlider.snappingRange) { if (range.Minimum <= newValue && newValue < range.Maximum) { baseValue = range.Value; } } } // When the mouse is not close to a 'Large Tick' position on the slider the value is returned unaltered, but when it is close it will snap into place by // coercing the value. return(baseValue); }
/// <summary> /// Is invoked whenever application code or internal processes call ApplyTemplate. /// </summary> public override void OnApplyTemplate() { // Once we've dug down into the templates to find the slider it can be attached to the value property of this control. Moving the slider will change // the value and any listeners attached to the value of this property will see the change also. this.viewSlider = this.GetTemplateChild(ViewButtonDropDown.partSlider) as ViewSlider; }