2017-03-31 4 views
1

Je développe actuellement plusieurs applications UWP où je veux utiliser les informations sur les dimensions Pixel de l'écran/écran dans lequel l'application fonctionne. Existe-t-il un meilleur moyen de récupérer cette information que ce que j'ai fait Je peux juger que cela fonctionne correctement jusqu'à présent)?Existe-t-il une méthode meilleure ou plus élégante pour déterminer les dimensions de pixels effectifs de l'affichage réel?

enum DimensionType { Height, Width } 
public static class DisplayInfo 
{ 
    public static uint EffictivePixelHeight 
    { 
     get { return GetEffectivePixels(DimensionType.Height); } 
    } 

    public static uint EffectivePixelWidth 
    { 
     get { return GetEffectivePixels(DimensionType.Width); } 
    } 

    /// <summary> 
    /// Calculate Effective Pixels based on RawPixelCount and ResolutionScale 
    /// </summary> 
    /// <param name="t">calculate width or height</param> 
    /// <returns>0 if invalid, effecective pixel height/width based on t</returns> 
    private static uint GetEffectivePixels(DimensionType t) 
    { 
     DisplayInformation info = DisplayInformation.GetForCurrentView(); 
     uint r = 0; 
     switch (t) 
     { 
      case DimensionType.Height: 
       r = info.ScreenHeightInRawPixels; 
       break; 
      case DimensionType.Width: 
       r = info.ScreenWidthInRawPixels; 
       break; 
      default: 
       break; 
     } 
     float sf = 0; 
     switch (info.ResolutionScale) 
     { 
      case ResolutionScale.Invalid: 
       sf = 0; 
       break; 
      case ResolutionScale.Scale100Percent: 
       sf = 1; 
       break; 
      case ResolutionScale.Scale120Percent: 
       sf = 1/1.2f; 
       break; 
      case ResolutionScale.Scale125Percent: 
       sf = 1/1.25f; 
       break; 
      case ResolutionScale.Scale140Percent: 
       sf = 1/1.4f; 
       break; 
      case ResolutionScale.Scale150Percent: 
       sf = 1/1.5f; 
       break; 
      case ResolutionScale.Scale160Percent: 
       sf = 1/1.6f; 
       break; 
      case ResolutionScale.Scale175Percent: 
       sf = 1/1.75f; 
       break; 
      case ResolutionScale.Scale180Percent: 
       sf = 1/1.8f; 
       break; 
      case ResolutionScale.Scale200Percent: 
       sf = 1/2f; 
       break; 
      case ResolutionScale.Scale225Percent: 
       sf = 1/2.25f; 
       break; 
      case ResolutionScale.Scale250Percent: 
       sf = 1/2.5f; 
       break; 
      case ResolutionScale.Scale300Percent: 
       sf = 1/3f; 
       break; 
      case ResolutionScale.Scale350Percent: 
       sf = 1/3.5f; 
       break; 
      case ResolutionScale.Scale400Percent: 
       sf = 1/4f; 
       break; 
      case ResolutionScale.Scale450Percent: 
       sf = 1/4.5f; 
       break; 
      case ResolutionScale.Scale500Percent: 
       sf = 1/5f; 
       break; 
      default: 
       sf = 0; 
       break; 
     } 

     r = (uint)(r * sf); 

     return r; 
    } 
} 

Répondre

1

Il semble que la façon dont vous essayez d'obtenir les dimensions effectives des pixels de l'écran/écran est juste. Mais vous utilisez un nombre de branches de commutation pour calculer le facteur d'échelle qui semble très fastidieux et inutile. En fait, il se peut que vous n'ayez besoin que d'une seule ligne de code pour calculer le facteur d'échelle.

double scaleFactor = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel; 

Ainsi, après simplifier votre extrait de code peut comme suit:

enum DimensionType { Height, Width } 
public static class DisplayInfo 
{ 
    public static uint EffictivePixelHeight 
    { 
     get { return GetEffectivePixels(DimensionType.Height); } 
    } 

    public static uint EffectivePixelWidth 
    { 
     get { return GetEffectivePixels(DimensionType.Width); } 
    } 

    /// <summary> 
    /// Calculate Effective Pixels based on RawPixelCount and ResolutionScale 
    /// </summary> 
    /// <param name="t">calculate width or height</param> 
    /// <returns>0 if invalid, effecective pixel height/width based on t</returns> 
    private static uint GetEffectivePixels(DimensionType t) 
    { 
     DisplayInformation info = DisplayInformation.GetForCurrentView(); 
     uint r = 0; 
     switch (t) 
     { 
      case DimensionType.Height: 
       r = info.ScreenHeightInRawPixels; 
       break; 
      case DimensionType.Width: 
       r = info.ScreenWidthInRawPixels; 
       break; 
      default: 
       break; 
     } 
     double scaleFactor = info.RawPixelsPerViewPixel;    
     r = (uint)(r * (1/scaleFactor)); 
     return r; 
    } 
} 

Plus de détails s'il vous plaît référence DisplayInformation classe.