57 lines
1.8 KiB
C#
57 lines
1.8 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Data;
|
||
|
||
namespace WpfAppTest
|
||
{
|
||
internal class UnitConverter : IValueConverter
|
||
{
|
||
private string DefaultUnit { get; set; } = "mm";
|
||
|
||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||
{
|
||
if (value == null)
|
||
return null;
|
||
|
||
if (value is double d)
|
||
{
|
||
string unit = parameter as string ?? DefaultUnit;
|
||
// 使用StringFormat时,value会先被格式化,这里直接拼接单位
|
||
return $"{d.ToString(culture)} {unit}";
|
||
}
|
||
|
||
return value;
|
||
}
|
||
|
||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||
{
|
||
if (value is string str)
|
||
{
|
||
// 提取纯数字字符串(允许中间态如 '1.', '-.')
|
||
str = str.Trim();
|
||
|
||
var match = Regex.Match(str, @"[-+]?[0-9]*\.?[0-9]*");
|
||
if (match.Success)
|
||
{
|
||
string numberPart = match.Value;
|
||
|
||
// 处理中间态输入,允许返回未完成的文本(让 UI 不抖动)
|
||
if (string.IsNullOrEmpty(numberPart) || numberPart.EndsWith("-") || numberPart.EndsWith(".") || numberPart.EndsWith("-."))
|
||
return DependencyProperty.UnsetValue;
|
||
|
||
if (double.TryParse(numberPart, NumberStyles.Any, culture, out double result))
|
||
return result;
|
||
}
|
||
}
|
||
|
||
return DependencyProperty.UnsetValue;
|
||
}
|
||
}
|
||
}
|