using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Data; namespace MegaRobo.C00225155App.Converters { public class DivisionConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { // 确保有两个值传入 if (values == null || values.Length < 2) return 0.0; // 尝试解析分子和分母 double numerator = TryParseDouble(values[0]); double denominator = TryParseDouble(values[1]); // 处理分母为零的情况 if (denominator == 0) return 0.0; // 计算比例并确保在 [0,1] 范围内 double ratio = numerator / denominator; return Math.Max(0, Math.Min(1, ratio)); } private double TryParseDouble(object value) { if (value is double d) return d; if (value is int i) return i; if (value is float f) return f; if (value is decimal dec) return (double)dec; return 0.0; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } public class InverseDivisionConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { // 确保有两个值传入 if (values == null || values.Length < 2 || values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue) return 0.0; // 尝试解析分子和分母 double numerator = TryParseDouble(values[0]); double denominator = TryParseDouble(values[1]); // 处理分母为零的情况 if (denominator == 0) return 1.0; // 分母为零时返回1(表示100%已使用) // 计算剩余比例 double remainingRatio = numerator / denominator; // 计算已使用比例:1 - 剩余比例 double usedRatio = 1.0 - remainingRatio; Console.WriteLine($"InverseDivisionConverter: numerator={numerator}, denominator={denominator}, remainingRatio={remainingRatio}, usedRatio={usedRatio}"); // 确保在 [0,1] 范围内 return Math.Max(0, Math.Min(1, usedRatio)); } private double TryParseDouble(object value) { if (value is double d) return d; if (value is int i) return i; if (value is float f) return f; if (value is decimal dec) return (double)dec; return 0.0; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } }