using System.Globalization;
using System.Windows.Data;
namespace Melskin.Converters.Internal;
// 根据进度、总宽度和滑块宽度(总高度)直接计算滑块位置
///
/// ThumbPositionConverter 类用于根据进度、总宽度和滑块宽度(或总高度)来计算滑块的位置。此转换器实现了 IMultiValueConverter 接口,允许它处理多个输入值,并返回一个基于这些输入值的输出值。
/// 该类提供了一个静态实例 (Instance),可以方便地在 XAML 中重用而无需创建新的实例。
///
///
/// 使用时,需要传递三个参数:进度(0.0 到 1.0 之间的数值)、总宽度以及滑块宽度(或当布局为垂直方向时使用总高度)。转换器会根据这些信息计算出滑块应该放置的确切位置。
/// 如果输入值不正确或存在异常情况,则返回 0.0 作为默认位置。
///
internal class ThumbPositionConverter : IMultiValueConverter
{
///
/// 获取 ThumbPositionConverter 类的单例实例。
/// 该实例用于根据进度、总宽度和滑块宽度(总高度)直接计算滑块位置。
///
///
/// 使用此属性可以方便地在 XAML 或代码中引用 ThumbPositionConverter 的同一实例,从而避免了多次创建对象带来的性能开销。
///
public static ThumbPositionConverter Instance { get; } = new();
///
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 3 || values.Any(v => v == null || v == DependencyProperty.UnsetValue))
return 0.0;
try
{
var progress = System.Convert.ToDouble(values[0]);
var totalWidth = System.Convert.ToDouble(values[1]);
var thumbWidth = System.Convert.ToDouble(values[2]);
var maxDistance = totalWidth - thumbWidth;
return progress * Math.Max(0, maxDistance);
}
catch
{
return 0.0;
}
}
///
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException(
);
}