RingProgressArcConverter.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Globalization;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows.Data;
  9. using System.Windows.Media;
  10. using Venus_Themes.CustomControls;
  11. namespace Venus_Themes.Converters
  12. {
  13. public class RingProgressArcConverter : IMultiValueConverter
  14. {
  15. // 注意,因为这里使用Path绘制圆环, 所以要把描边宽度大小考虑进去. 所有点的x、y偏移 半个描边宽度
  16. public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  17. {
  18. double value;
  19. if (values[0] is double width
  20. && values[1] is double height
  21. && width > 0 && height > 0
  22. && values[2] is double storkeWidth)
  23. {
  24. width -= storkeWidth;
  25. height -= storkeWidth;
  26. value = values.Length == 4 ? System.Convert.ToDouble(values[3]) : 1d;
  27. if (value == 0) return "";
  28. var startAngle = -90d;
  29. var endAngle = Math.Min(value * 360 - 90, 269);
  30. var radius = Math.Min(width, height) * 0.5;
  31. var start = startAngle.AngleToPoint(radius, storkeWidth * 0.5);
  32. var end = endAngle.AngleToPoint(radius, storkeWidth * 0.5);
  33. var dataStr = $"M {start.X},{start.Y} A {radius},{radius} 0 {(endAngle - startAngle >= 180 ? 1 : 0)} 1 {end.X},{end.Y}";
  34. var converter = TypeDescriptor.GetConverter(typeof(Geometry));
  35. return (Geometry)converter.ConvertFrom(dataStr);
  36. }
  37. else
  38. {
  39. return "";
  40. }
  41. }
  42. public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  43. {
  44. throw new NotImplementedException();
  45. }
  46. }
  47. }