2025-08-20 12:10:35 +08:00
|
|
|
|
using System.Globalization;
|
|
|
|
|
|
using System.Windows.Data;
|
|
|
|
|
|
|
2026-01-02 17:30:41 +08:00
|
|
|
|
namespace Melskin.Converters.Internal;
|
2025-08-20 12:10:35 +08:00
|
|
|
|
|
|
|
|
|
|
// 根据进度、总宽度和滑块宽度(总高度)直接计算滑块位置
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ThumbPositionConverter 类用于根据进度、总宽度和滑块宽度(或总高度)来计算滑块的位置。此转换器实现了 IMultiValueConverter 接口,允许它处理多个输入值,并返回一个基于这些输入值的输出值。
|
|
|
|
|
|
/// 该类提供了一个静态实例 (Instance),可以方便地在 XAML 中重用而无需创建新的实例。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <remarks>
|
|
|
|
|
|
/// 使用时,需要传递三个参数:进度(0.0 到 1.0 之间的数值)、总宽度以及滑块宽度(或当布局为垂直方向时使用总高度)。转换器会根据这些信息计算出滑块应该放置的确切位置。
|
|
|
|
|
|
/// 如果输入值不正确或存在异常情况,则返回 0.0 作为默认位置。
|
|
|
|
|
|
/// </remarks>
|
|
|
|
|
|
internal class ThumbPositionConverter : IMultiValueConverter
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取 ThumbPositionConverter 类的单例实例。
|
|
|
|
|
|
/// 该实例用于根据进度、总宽度和滑块宽度(总高度)直接计算滑块位置。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <remarks>
|
|
|
|
|
|
/// 使用此属性可以方便地在 XAML 或代码中引用 ThumbPositionConverter 的同一实例,从而避免了多次创建对象带来的性能开销。
|
|
|
|
|
|
/// </remarks>
|
|
|
|
|
|
public static ThumbPositionConverter Instance { get; } = new();
|
|
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
|
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException(
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|