1

我们可能将在我们的应用程序中引入 UnitsNet,原因有两个:类型安全计算和在不同单位系统(公制、英制等)之间切换的能力。这意味着这些类型将遍布我们的应用程序以及我们的视图模型以进行展示. 这就是棘手的地方。我希望在 GUI 中或多或少地自动显示各种数量,仅通过指定所需的单位。

由于会有很多这样的数量,因此总是在 xaml 文件中指定类型转换器会很烦人,而且我不确定是否可以指定同时显示哪个单位。

那么什么是一个好的方法呢?编写自己的用户控件,使用转换属性,还是有更好的方法?

4

1 回答 1

1

UnitsNet数量类(例如LengthMass等)具有一个public static ToStringDefaultUnit属性,您可以将其设置为Unit您希望数量类ToString在运行时显示为 ( ) 的任何值。

例如:

Length myLength = Length.FromMeters(1);

//default Length.ToStringDefaultUnit is LengthUnit.Meter
string display1 = myLength.ToString(); //1m

Length.ToStringDefaultUnit = LengthUnit.Centimeter;
string display2 = myLength.ToString(); //100cm

Length.ToStringDefaultUnit = LengthUnit.Foot; 
string display3 = myLength.ToString(); //3.28ft

如果每个数量需要不同的单位,那么创建新类型来表示差异是个好主意。复制 UnitsNet 如何实现一致也是一个好主意。

public struct ShortLength
{
    private Length _internalLength;
    public ShortLength(QuantityValue centimeters)
    {
        _internalLength = Length.FromCentimeters(centimeters);
    }
    public static ShortLength FromCentimeters(QuantityValue value)
    {
        return new ShortLength(value);
    }
    public static LengthUnit ToStringDefaultUnit { get; set; } = LengthUnit.Centimeter;

    public override string ToString()
    {
        return ToString(ToStringDefaultUnit);
    }

    public string ToString(LengthUnit lengthUnit)
    {
        //just copy how UnitsNet implement ToString
    }
}

利用该ToStringDefaultUnit属性的一种方法是使用一个类来管理整个应用程序的转换。这样,您的单位转换就不会到处都是。

public static class AppUnitSystem
{
    public static void ToMetric()
    {
        Length.ToStringDefaultUnit = LengthUnit.Meter;
        ShortLength.ToStringDefaultUnit = LengthUnit.Centimeter;

        Density.ToStringDefaultUnit = DensityUnit.KilogramPerCubicMeter;

        //TODO: other quantities...
    }

    public static void ToImperial()
    {
        Length.ToStringDefaultUnit = LengthUnit.Foot;
        ShortLength.ToStringDefaultUnit = LengthUnit.Inch;

        Density.ToStringDefaultUnit = DensityUnit.PoundPerCubicFoot;

        //TODO: other quantities...
    }
}   
于 2017-12-15T19:17:45.910 回答