2016-07-21 15 views
0

AdaptiveTrigger mit MinWindowWidth = 2160 scheint nicht zu funktionieren. Ich brauche es, um Microsoft Surface Pro 3 Bildschirmauflösung (2160x1440) zu behandeln.VisualState AdaptiveTrigger MinWindowWidth = 2160 funktioniert nicht

Blick auf diesem einfachen Code unten:

<Page 
    x:Class="TestUWP.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:TestUWP" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="2160" d:DesignHeight="1440"> 

    <Grid> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup> 
       <VisualState> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="2160" /> 
        </VisualState.StateTriggers> 
        <VisualState.Setters> 
         <Setter Target="brdMain.Background" Value="#bbbbbb"></Setter> 
        </VisualState.Setters> 
       </VisualState> 
       <VisualState> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="0" /> 
        </VisualState.StateTriggers> 
        <VisualState.Setters> 
         <Setter Target="brdMain.Background" Value="#303030"></Setter> 
        </VisualState.Setters> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <Border x:Name="brdMain"> 
      <TextBlock Text="Testing"></TextBlock> 
     </Border> 
    </Grid> 
</Page> 

Sie werden sehen, die Hintergrundfarbe ist immer schwarz (# 303030). Gibt es eine maximale Breite, die VisualState verarbeiten kann? Irgendeine Idee?

Dank

Antwort

4

Sie müssen bedenken, dass die Messungen in UWP in effektiven Pixeln (EPX) durchgeführt. Siehe MSDN. Surface Pro 3 hat wie andere Surface-Tablets eine HiDPI-Anzeige und einen Standardskalierungsfaktor größer als 1, was bedeutet, dass die effektive Pixelauflösung kleiner ist als, obwohl dies die native Auflösung von 2160x1440 ist.

Der Standard-Skalierungsfaktor des SP3 beträgt 150%, was zu einer epx-Auflösung von 1440x960 führt. Selbst wenn Sie Ihr Fenster maximieren, beträgt die Fensterbreite nur maximal 1440 epx, was bedeutet, dass der Statustrigger MinWindowWidth="2160" niemals auf einem SP3 mit Standardeinstellungen ausgelöst wird.

Wenn Ihr Statustrigger nur auf Tablets mit HiDPI-Anzeigen und/oder einer bestimmten nativen Auflösung ausgelöst werden soll, müssen Sie wahrscheinlich einen benutzerdefinierten Statustrigger implementieren, der alle diese Bedingungen erkennt. Wie Sie dies tun, geht über den Rahmen dieser Frage hinaus.

+0

WOW, du hast absolut recht! Wie haben Sie den Skalierungsfaktor herausgefunden? – Sam

+0

@Sam: Ich wünschte, ich könnte sagen, ich besaß eine Surface Pro 3, aber ich sah nur eine im Laden. In aller Ernsthaftigkeit wird die Display-Skalierung zur Norm, da viele mobile und Tablet-Displays HiDPI sind. Deshalb legt UWP so viel Wert auf effektive Pixel. – BoltClock

0

Ich denke, Ihre Größe könnte aus sein. Hast du noch andere ausprobiert?

Nach dem Official MSDN Screen Sizes and Layouts Documentation das sind die Größen, die Sie

enter image description here

Der Grund, warum Sie wahrscheinlich nicht wollen, die genaue Bildschirmgröße verwenden möchten, weil das, was jemand ist davon abhalten es Einstellung ein wenig nach unten oder ein wenig hoch?

Persönlich, für komplexere Layouts, bevorzuge ich separate Ansichten für jede Größe zu erstellen. Es gibt mir mehr Kontrolle über das Layout. Hier ist, wie ich es benutze.

In einer statischen Anwendung Klasse habe ich.

public enum DeviceType 
    { 
     Desktop = 0, 
     Phablet = 1, 
     Mobile = 2 
    }  

    public static DeviceType CurrentDevice 
    { 
     get 
     { 
      ApplicationView view = ApplicationView.GetForCurrentView(); 
      Rect rect = view.VisibleBounds; 

      if (rect.Width >= 1024) 
      { 
       return DeviceType.Desktop; 
      } 
      else if (rect.Width >= 720) 
      { 
       return DeviceType.Phablet; 
      } 
      else 
      { 
       return DeviceType.Mobile; 
      } 
     } 
    } 

Dann in meiner Kontrolle ich nur auf meine statische Klasse in meinem statischen Konstruktor zugreifen. Wenn ich ein mobiles Gerät bin, lade ich einen mobilen DefaultStyleKey. Wenn ich Desktop bin, dann lade ich einen DesktopDefaultStyleKey.

DeviceType device = ApplicationServices.CurrentDevice; 

    switch (device) 
    { 
     case (DeviceType.Desktop): 
      YoutubeVideosPresenter.Content = new YouTubeVideosLayoutDesktop(); 
      break; 
     case (DeviceType.Mobile): 
      YoutubeVideosPresenter.Content = new YouTubeVideosLayoutMobile(); 
      break; 
    }   

Natürlich ist das nicht sehr "adaptiv", wenn jemand die Fensterbreite manipuliert. Sie können jedoch leicht darüber hinwegkommen, indem Sie überprüfen, ob sich die Fensterbreite geändert hat und dann kann Ihr Stil leicht ausgewechselt werden.

+0

Hallo Anthony, wenn Sie sehen. VisibleBounds. Ist der Wert eine physikalische Auflösung oder effektive Pixel? – Sam

+0

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.viewmanagement.applicationview.visiblebounds.aspx –