2016-06-21 9 views
5

Ich habe eine Methode mit einer switch Aussage wie diese, die jedes Mal, wenn die Größe des Fensters wird geändert aufgerufen werden:Methode Schriftgröße mit switch-Anweisung ändern

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; 
} 

jetzt dachte ich, dass es eine mehr sein schöne und kürzere Lösung hierfür mit einer privaten Methode. Aber hier kämpfe ich. Ich könnte so etwas tun:

Ich müsste diese Methode nur für jede Schriftart aufrufen, die ich ändern möchte. Aber ich denke nicht, dass dies der schönste und einfachste Weg ist, um das zu tun, was ich will. Vielleicht ist es einfach zu früh am Morgen logisch zu denken.

Ich habe auch versucht dies:

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

Aber meiner Meinung nach ist dies eine Verbesserung nicht wirklich, weil ich gerade fontSup = someBoolean ? 18 : 6;-fontSup = SetFontSize(someBoolean, 18, 6); sich ändern müssten.

Könnten Sie mir bitte helfen, eine angemessene Lösung zu bekommen?

+0

Ich denke, Microsoft bietet einige allgemeine Auflösungen Einstellungen, die Sie verwenden können oder programmgesteuert tun es selbst. –

+0

Falls Sie xlab verwenden oder es bereits tun möchten, steht ein [FontManager] (http://xlabs.github.io/html/class_x_labs_1_1_forms_1_1_services_1_1_font_manager.html) zur Verfügung. –

+0

Switch-Methode ist sauber genug imho. Für hartcodierte Parameter. Wenn Sie diese Einstellungen in einer externen Datei (z. B. xml) speichern, ist 'Dictionary' eine bessere Option. Wenn Sie eine Methode aufrufen wollen, übergeben Sie einfach alle Schriften (als 'ref' Parameter) und' someBoolean'. Sie können erwägen, alle Zeichensätze innerhalb eines Typs zu speichern, dann müssen Sie nur eine Instanz davon (ohne 'ref') anstelle von 4 Zeichensätzen übergeben. – Sinatr

Antwort

4

Sie so etwas tun könnte:

Erstens kapseln die Schriftgrößeneinstellungen in einer Klasse:

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

Jetzt können Sie eine statische FontSize initialisieren und eine statische Dictionary<DeviceFamily, FontSize> irgendwo in der Klasse wie folgt :

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 } } 
}; 

Dann eine Lookup-Methode implementieren eine FontSize von einem Bool und einzurückzukehrenwie folgt:

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]; 
} 
+1

Schön! Genau das habe ich gesucht. Vielen Dank. –

0

Interessant Ich denke, was am wichtigsten ist, ist dies. Bei einem booleschen Wert sollte eine Gerätefamilie für den angezeigten Text die oben angegebene Schriftart haben. Sie sind jedoch nicht proportional zueinander. Also dieser Schalter Fall ist der beste Weg, um es anders als einige Fourier-Serie Approximation, die Ihnen die richtigen Schriftarten als eine Funktion der beiden Variablen eine Boolean und Gerätefamilie geben würde oder den Einsatz von Micosoft-Code, der das Problem unter den Teppich aber wirklich fegt macht das Gleiche.