使用开关语句更改字体大小的方法



我有一种具有这样的 switch语句的方法

int fontSup = someBoolean ? 18 : 12;
int fontSmall = someBoolean ? 22 : 15;
int fontNormal = someBoolean ? 26 : 20;
int fontTitle = someBoolean ? 28 : 22;
switch (Window.DeviceFamily)
{
    case DeviceFamily.Phone:
        fontSup = someBoolean ? 18 : 6;
        fontSmall = someBoolean ? 22 : 8;
        fontNormal = someBoolean ? 26 : 12;
        fontTitle = someBoolean ? 28 : 14;
        break;
    case DeviceFamily.Tablet:
        fontSup = someBoolean ? 18 : 8;
        fontSmall = someBoolean ? 22 : 12;
        fontNormal = someBoolean ? 26 : 15;
        fontTitle = someBoolean ? 28 : 17;
        break;
    case DeviceFamily.Desktop:
        fontSup = someBoolean ? 18 : 12;
        fontSmall = someBoolean ? 22 : 15;
        fontNormal = someBoolean ? 26 : 20;
        fontTitle = someBoolean ? 28 : 22;
        break;
}

我现在认为使用私人方法会有一个更美丽,更短的解决方案。但是,我在这里挣扎。我可以做这样的事情:

private void SetFontSize (ref int fontToChange, bool someBoolean, int firstValue, int secondValue)
{
    // Same switch statement as in the other method
}

我只需要为要更改的每种字体调用此方法。但是我认为这不是做我想做的最美丽和最简单的方法。也许在逻辑上思考还为时过早。

我也尝试过:

private int SetFontSize (bool someBoolean, int firstValue, int secondValue)
{
    return (someBoolean ? firstValue : secondValue);
}

,但我认为这并不是真正的改进,因为我只需要将fontSup = someBoolean ? 18 : 6;更改为fontSup = SetFontSize(someBoolean, 18, 6);

您能帮我获得适当的解决方案吗?

您可以做这样的事情:

首先,将字体大小设置封装在类中:

public sealed class FontSize
{
    public int Sup;
    public int Small;
    public int Normal;
    public int Title;
}

现在,您可以在同类中的某个地方初始化静态FontSize和静态Dictionary<DeviceFamily, FontSize>

static readonly FontSize _defaultFontSize = new FontSize { Sup = 18, Small = 22, Normal = 26, Title = 28 };
static readonly Dictionary<DeviceFamily, FontSize> _fontSizeMap = new Dictionary<DeviceFamily, FontSize>
{
    { DeviceFamily.Phone,   new FontSize { Sup =  6, Small =  8, Normal = 12, Title = 14 } },
    { DeviceFamily.Tablet,  new FontSize { Sup =  8, Small = 12, Normal = 15, Title = 17 } },
    { DeviceFamily.Desktop, new FontSize { Sup = 12, Small = 15, Normal = 20, Title = 22 } }
};

然后实现一种查找方法,以从布尔返回 FontSizeDeviceFamily类似:

public static FontSize GetFontSize(DeviceFamily deviceFamily, bool someBoolean)
{
    if (!Enum.IsDefined(typeof(DeviceFamily), deviceFamily))
        throw new ArgumentOutOfRangeException(nameof(deviceFamily));
    if (someBoolean)
        return _defaultFontSize;
    return _fontSizeMap[deviceFamily];
}

有趣的是,我认为最重要的是。鉴于布尔值,您的分配文本的设备系列应具有上面列出的给定字体。但是,它们并不成比例。因此,此开关情况是除了某些傅立叶系列近似之外的最佳方法,它可以为您提供正确的字体,作为两个变量的函数,是布尔和设备家族的函数,或使用在地毯下扫除问题的Micosoft Code做同样的事情。

最新更新