功能更新
This commit is contained in:
48
Melskin/Converters/Internal/ThumbPositionConverter.cs
Normal file
48
Melskin/Converters/Internal/ThumbPositionConverter.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Melskin.Converters.Internal;
|
||||
|
||||
// 根据进度、总宽度和滑块宽度(总高度)直接计算滑块位置
|
||||
/// <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(
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user