Snap & Fill
Jest to ciąg dalszy moich artykułów na temat programowania pod metro dla Windows 8. Dziś mam dla was funkcje snap i fill. Czym są? A są to nowe tryby w ramach których może pracować nasza aplikacja.
Tryb snap (snapping) pozwala na podgląd zawartości aplikacji. Aplikacja jest zadokowana do lewej lub prawek krawędzi i ma 320 pikseli szerokości. Nie może mieć więcej lub mniej szerokości. Tryb ten jest dostępny dopiero od rozdzielczości 1366×768. W mniejszej rozdzielczości funkcje snap i fill są niedostępne.
Aplikacja w trybie snap znajduje się po lewej stronie natomiast druga aplikacja znajduje się w trybie fill i zajmuje resztę dostępnego miejsca.
Przejdźmy teraz do kodu dzięki któremu możemy coś takiego uzyskać. Aby móc wykrywać zmiany stanu ekranu należy się podpiąć pod zdarzenie ViewStateChanged które dostępne jest w klasie ApplicationView po wywołaniu metody GetForCurrentView()
ApplicationView.GetForCurrentView().ViewStateChanged += new TypedEventHandler<ApplicationView, ApplicationViewStateChangedEventArgs>(this.OnViewStateChanged);
Do TypeEventHandler jako parametr jest przekazywana metoda cel która będzie uruchamiana przy wystąpieniu zdarzenia. Sama metoda obsługi zdarzenia wygląda następująco.
public void OnViewStateChanged(object sender, ApplicationViewStateChangedEventArgs args) { switch (args.ViewState) { case Windows.UI.ViewManagement.ApplicationViewState.Filled: VisualStateManager.GoToState(this, "Fill", false); break; case Windows.UI.ViewManagement.ApplicationViewState.FullScreenLandscape: VisualStateManager.GoToState(this, "Full", false); break; case Windows.UI.ViewManagement.ApplicationViewState.Snapped: VisualStateManager.GoToState(this, "Snapped", false); break; case Windows.UI.ViewManagement.ApplicationViewState.FullScreenPortrait: VisualStateManager.GoToState(this, "Portrait", false); break; default: break; } }
W moim przypadku wygląd jest modyfikowany przy pomocy wizualnych stanów. W zależności jaki tryb ekranu jest tak następuje przejście do odpowiedniego stanu wizualnego.
Pisząc aplikacje metro trzeba pamiętać o tym aby aplikacje miały odpowiednie wyglądy w trybach snap i fill ponieważ każda aplikacja może znaleźć się w tych trybach trzeba zadbać aby prezentowane dane były czytelne.
Edycja 04.05.2012
Dziś znalazłem jeszcze jedną fajną i wydaje mi się prostszą metodę do sprawdzania czy nastąpiła zmiana trybu pracy naszej aplikacji a jest to zdarzenie LayoutChanged. Kod prezentuje się tak.
ApplicationLayout.GetForCurrentView().LayoutChanged += MainPage_LayoutChanged;
void MainPage_LayoutChanged(ApplicationLayout sender, ApplicationLayoutChangedEventArgs args)
{
Visibility metroChromeVisibility = args.Layout == ApplicationLayoutState.Snapped ?
Visibility.Collapsed : Visibility.Visible;
}
Właściwość Layout przechowuje aktualny tryb pracy naszej aplikacji.
Oprócz tego napotkałem się również na zdarzenie zmiany orientacji a znajduje się w klasie DisplayProperties.OrientationChanged.