private void UpdateRingThumb() { if (_ringThumb == null) { return; } if (_containerGrid.ActualHeight <= 2 * (RingThickness + ThumbBorderThickness) || _containerGrid.ActualWidth <= 2 * (RingThickness + ThumbBorderThickness)) { return; } //VisualTreeDebugger2.DebugVisualTree(_ringThumb, true); // Hue ring needs to be smaller than available container space so the thumb fits var hueRingSize = Math.Min( _containerGrid.ActualWidth - 2 * ThumbBorderThickness, _containerGrid.ActualHeight - 2 * ThumbBorderThickness); //if (_ringThumb.Width != hueRingSize + 2 * ThumbBorderThickness) { _ringThumb.Width = hueRingSize + 2 * ThumbBorderThickness; _ringThumb.Height = hueRingSize + 2 * ThumbBorderThickness; _ringThumb.BeginUpdate(); // Half of the thumb border stroke goes outside the radius and the other half goes inside, // so radius needs to be 0.5 border thickness larger than the hue ring's outer radius. // Less 1 to make sure there is an overlap. _ringThumb.Center = new Point( hueRingSize / 2 + ThumbBorderThickness, hueRingSize / 2 + ThumbBorderThickness); _ringThumb.Radius = (hueRingSize + ThumbBorderThickness) / 2 - 1; _ringThumb.InnerRadius = _ringThumb.Radius - RingThickness - ThumbBorderThickness + 2; _ringThumb.StartAngle = this.Value - ThumbArcAngle / 2; _ringThumb.EndAngle = this.Value + ThumbArcAngle / 2; //_ringThumb.StartAngle = - ThumbArcAngle / 2; //_ringThumb.EndAngle = ThumbArcAngle / 2; _ringThumb.EndUpdate(); } _ringThumb.Stroke = new SolidColorBrush( ColorExtensions.FromHsv(this.Value, 0.5, 1.0)); }