private async void RunTriangleUpdaterAsync()
        {
            do
            {
                await _triangleUpdateRequired.WaitAsync();

                if (_isLoaded)
                {
                    var wb = new WriteableBitmap(
                        (int)trianglePicker.ActualWidth,
                        (int)trianglePicker.ActualHeight);

                    var wbHue = new WriteableBitmap(
                        (int)slidersPanel.ActualWidth - 80,
                        1);

                    var wbSaturation = new WriteableBitmap(
                        (int)slidersPanel.ActualWidth - 80,
                        1);

                    var wbLightness = new WriteableBitmap(
                        (int)slidersPanel.ActualWidth - 80,
                        1);

                    var wbRed = new WriteableBitmap(
                        (int)slidersPanel.ActualWidth - 80,
                        1);

                    var wbGreen = new WriteableBitmap(
                        (int)slidersPanel.ActualWidth - 80,
                        1);

                    var wbBlue = new WriteableBitmap(
                        (int)slidersPanel.ActualWidth - 80,
                        1);

                    var color = ColorExtensions.FromHsl(hueRing.Value, 1, 0.5);

                    await Task.WhenAll(
                        wb.RenderColorPickerSaturationValueTriangleAsync(hueRing.Value),
                        wbHue.RenderColorPickerHSLHueBarAsync(1.0, 0.5),
                        wbSaturation.RenderColorPickerHSLSaturationBarAsync(hueRing.Value, 0.5),
                        wbLightness.RenderColorPickerHSLLightnessBarAsync(hueRing.Value, 0.5),
                        wbRed.RenderColorPickerRGBRedBarAsync(color.G / 255.0, color.B / 255.0),
                        wbGreen.RenderColorPickerRGBGreenBarAsync(color.R / 255.0, color.B / 255.0),
                        wbBlue.RenderColorPickerRGBBlueBarAsync(color.R / 255.0, color.G / 255.0));

                    if (_isLoaded)
                    {
                        triangleBrush.ImageSource = wb;
                        hueBackground.ImageSource = wbHue;
                        saturationBackground.ImageSource = wbSaturation;
                        lightnessBackground.ImageSource = wbLightness;
                        redBackground.ImageSource = wbRed;
                        greenBackground.ImageSource = wbGreen;
                        blueBackground.ImageSource = wbBlue;
                    }
                }
            } while (_isLoaded);
        }
        private void OnHueRingImage2SizeChanged(object sender, SizeChangedEventArgs e)
        {
            if (hueRingImage2.ActualHeight == 0 ||
                hueRingImage2.ActualWidth == 0)
            {
                return;
            }

            var minSize = Math.Min(hueRingImage2.ActualHeight, hueRingImage2.ActualWidth);
            var outerRingRadius = minSize / 2;
            var innerRingRadius = outerRingRadius * 2 / 3;
            var triangleWidth = innerRingRadius * Math.Sqrt(3);
            var triangleHeight = innerRingRadius * 3 / 2;
            var wb = new WriteableBitmap((int)triangleWidth, (int)triangleHeight);
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
            wb.RenderColorPickerSaturationValueTriangleAsync();
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
            saturationValueTriangleImage.Source = wb;
            saturationValueTriangleImage.Margin = new Thickness(0, outerRingRadius - innerRingRadius, 0, outerRingRadius - innerRingRadius * 0.5);
        }
        private void OnHueRingImage2SizeChanged(object sender, SizeChangedEventArgs e)
        {
            if (hueRingImage2.ActualHeight == 0 ||
                hueRingImage2.ActualWidth == 0)
            {
                return;
            }

            var minSize = Math.Min(hueRingImage2.ActualHeight, hueRingImage2.ActualWidth);
            var outerRingRadius = minSize / 2;
            var innerRingRadius = outerRingRadius * 2 / 3;
            var triangleWidth = innerRingRadius * Math.Sqrt(3);
            var triangleHeight = innerRingRadius * 3 / 2;
            var wb = new WriteableBitmap((int)triangleWidth, (int)triangleHeight);
            wb.RenderColorPickerSaturationValueTriangleAsync();
            saturationValueTriangleImage.Source = wb;
            saturationValueTriangleImage.Margin = new Thickness(0, outerRingRadius - innerRingRadius, 0, outerRingRadius - innerRingRadius * 0.5);
        }