2012-06-11 15 views
8

Powiedzmy, że mam siatkę z 2 rzędami, 2 kolumnami i wieloma kontrolkami wewnątrz każdej komórki.Jak wykrywać zmiany orientacji i zmieniać układ?

Gdy aplikacja zostanie zmieniona na tryb przyciągania, miałem na myśli 1/3 ekranu, na którym chciałbym, aby aplikacja była tylko, jedna kolumna, 2 rzędy i pokazywała tylko niektóre kontrolki, które bym zdecydował.

Jaki rodzaj kontroli mam do tego?

thx

Odpowiedz

8

Należy skorzystać z VisualStateManager w XAML, dla pełnego rozwiązania xaml:

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="OrientationStates"> 
      <VisualState x:Name="Full"/> 
      <VisualState x:Name="Fill"/> 
      <VisualState x:Name="Portrait"/> 
      <VisualState x:Name="Snapped"/> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
</Grid> 

Tworzenie storyboardy dla każdego VisualState i ukryj/pokaż elementów w XAML. Przykłady Microsoft używają tego samego rozwiązania.

-

Aktualizacja

Szukałem po sieci i znaleźć odpowiednie stany, przykładem jest za tym linkiem: MSDN.

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="ApplicationViewStates"> 
     <VisualState x:Name="FullScreenLandscape"/> 
     <VisualState x:Name="Filled"/> 
     <VisualState x:Name="FullScreenPortrait"/> 
     <VisualState x:Name="Snapped"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Stany odzwierciedlają wyliczenie ApplicationViewState. Jeszcze więcej informacji można znaleźć here.

+0

można proszę opracowania twoja odpowiedź bardziej ?, z twoją pomocą mógłbym dostać ten link, http://www.markermetro.com/2011/11/technical/windows-8-meto-style-apps-layout-and-orientation-management-with- xaml /, więc oznacza to, że muszę napisać inny układ dla każdego stanu wizualnego i ponownie powiązać dane o każdej zmianie orientacji z odpowiednimi kontrolkami w zależności od stanu? –

+0

Tak!Byłoby to rzeczywiście najmilsze, jedyne rozwiązanie, aaam. Możesz za pomocą sprytnych scenorysów ponownie wykorzystać niektóre z twoich elementów, ale będziesz musiał stworzyć różne układy. Jeśli to zrobisz, dobrze jest przenieść je do osobnych kontrolek użytkownika lub widoków i uwzględnić je. – Kolky

+0

Przepraszam, byłem trochę ograniczony. Microsoft utworzył podstawową klasę strony, która obsługuje te VisualStates. Zaktualizowałem swój post bardziej użytecznym przykładem ... – Kolky

9

Korzystanie DisplayProperties.OrientationChanged zdarzenie (jak sugeruje @Jan K.) nie może być dokładnie to, czego szukasz, biorąc pod uwagę sekcję Uwagi do tego wydarzenia:

DisplayProperties.OrientationChanged zdarzenie tylko wtedy, gdy orientacja wyświetlacza lub monitora zmienia się, a niekoniecznie po zmianie orientacji aplikacji. Aby określić orientację swojej aplikacji do celów układu, użyj właściwości ApplicationView.Value.

ale ponieważ ApplicationView.Value prawdopodobnie zostanie przerwany po systemu Windows 8.1 uwolnienie MS sugerują użycie ApplicationView.GetForCurrentView() zamiast:

ApplicationView metody statyczne mogą być zmienione lub niedostępne dla wydań po systemie Windows 8.1 Podgląd. Zamiast tego należy użyć ApplicationView.GetForCurrentView(), aby uzyskać instancję ApplicationView.

Więc teraz mam skończyć z tym kodem (czy rodzaj dynamicznego widzenia i nie może pre-Design wszystko w XAML poprzez VisualStateManager niestety):

public MainPage() 
{ 
    InitializeComponent(); 
    Window.Current.SizeChanged += (sender, args) => 
    { 
     ApplicationView currentView = ApplicationView.GetForCurrentView(); 

     if (currentView.Orientation == ApplicationViewOrientation.Landscape) 
     { 
      // when args.Size.Width > args.Size.Height 
     } 
     else if (currentView.Orientation == ApplicationViewOrientation.Portrait) 
     { 
      // when args.Size.Width < args.Size.Height 
     } 
    }; 
} 
Powiązane problemy