1 changed files with 88 additions and 0 deletions
@ -0,0 +1,88 @@ |
|||||
|
using System; |
||||
|
using System.Globalization; |
||||
|
using Avalonia; |
||||
|
using Avalonia.Controls.Primitives; |
||||
|
using Avalonia.Data.Converters; |
||||
|
using Avalonia.Media; |
||||
|
|
||||
|
namespace FinancialManager.UWP |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Gets a color, either black or white, depending on the perceived brightness of the supplied color.
|
||||
|
/// </summary>
|
||||
|
public class ContrastBrushConverter : IValueConverter |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Gets or sets the alpha channel threshold below which a default color is used instead of black/white.
|
||||
|
/// </summary>
|
||||
|
public byte AlphaThreshold { get; set; } = 128; |
||||
|
|
||||
|
/// <inheritdoc/>
|
||||
|
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) |
||||
|
{ |
||||
|
Color comparisonColor; |
||||
|
Color? defaultColor = null; |
||||
|
|
||||
|
// Get the changing color to compare against
|
||||
|
if (value is Color valueColor) |
||||
|
{ |
||||
|
comparisonColor = valueColor; |
||||
|
} |
||||
|
else if (value is HsvColor valueHsvColor) |
||||
|
{ |
||||
|
comparisonColor = valueHsvColor.ToRgb(); |
||||
|
} |
||||
|
else if (value is SolidColorBrush valueBrush) |
||||
|
{ |
||||
|
comparisonColor = valueBrush.Color; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// Invalid color value provided
|
||||
|
return AvaloniaProperty.UnsetValue; |
||||
|
} |
||||
|
|
||||
|
// Get the default color when transparency is high
|
||||
|
if (parameter is Color parameterColor) |
||||
|
{ |
||||
|
defaultColor = parameterColor; |
||||
|
} |
||||
|
else if (parameter is HsvColor parameterHsvColor) |
||||
|
{ |
||||
|
defaultColor = parameterHsvColor.ToRgb(); |
||||
|
} |
||||
|
else if (parameter is SolidColorBrush parameterBrush) |
||||
|
{ |
||||
|
defaultColor = parameterBrush.Color; |
||||
|
} |
||||
|
|
||||
|
if (comparisonColor.A < AlphaThreshold && |
||||
|
defaultColor.HasValue) |
||||
|
{ |
||||
|
// If the transparency is less than the threshold just use the default brush
|
||||
|
// This can commonly be something like the TextControlForeground brush
|
||||
|
return new SolidColorBrush(defaultColor.Value); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// Chose a white/black brush based on contrast to the base color
|
||||
|
if (ColorHelpers.GetRelativeLuminance(comparisonColor) > 0.5) |
||||
|
{ |
||||
|
// Bright color, use a dark for contrast
|
||||
|
return new SolidColorBrush(Colors.Black); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// Dark color, use a light for contrast
|
||||
|
return new SolidColorBrush(Colors.White); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/// <inheritdoc/>
|
||||
|
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) |
||||
|
{ |
||||
|
throw new NotImplementedException(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue