Programowanie .NET

Archive for the tag “Settings”

Settings

Wita w dzisiejszym poście dalej męczę temat charms bar (Win + C) czyli prawego wysuwanego paska. Dziś zajmiemy się ustawieniami naszej aplikacji. Co to znaczy? W przypadku aplikacji metro pisanych na Windows 8 Microsoft mocno zaleca używania jednego miejsca dla ustawień znajduje się właśnie na prawym wysuwanym pasku pod przyciskiem Settings. Jest to miejsce gdzie powinniśmy trzymać ustawienia ponieważ i tak użytkownik musi wejść w to miejsce jeśli będzie chciał zmienić ustawienia nadane przez nas przy pomocy Copabilities. Drugim powodem jest ujednolicenie w obrębie wszystkich aplikacji miejsca gdzie znajdują się ustawienia.

Aby zacząć prace nad ustawieniami trzeba zacząć od stworzenia klasy która będzie definiować ustawienia wysuwanej palety (czyli miejsca w którym będą wyświetlanie ustawienia). Więc dodajmy klasę SettingsFlyout.cs do folderu Common zawartość klasy prezentuje się następująco.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;

namespace ContosoCookbook.Common
{
    class SettingsFlyout
    {
        private const int _width = 346;
        private Popup _popup;

        public void ShowFlyout(UserControl control)
        {
            _popup = new Popup();
            _popup.Closed += OnPopupClosed;
            Window.Current.Activated += OnWindowActivated;
            _popup.IsLightDismissEnabled = true;
            _popup.Width = _width;
            _popup.Height = Window.Current.Bounds.Height;

            control.Width = _width;
            control.Height = Window.Current.Bounds.Height;

            _popup.Child = control;
            _popup.SetValue(Canvas.LeftProperty, Window.Current.Bounds.Width - _width);
            _popup.SetValue(Canvas.TopProperty, 0);
            _popup.IsOpen = true;
        }

        private void OnWindowActivated(object sender, Windows.UI.Core.WindowActivatedEventArgs e)
        {
            if (e.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated)
            {
                _popup.IsOpen = false;
            }
        }

        void OnPopupClosed(object sender, object e)
        {
            Window.Current.Activated -= OnWindowActivated;
        }
    }
}

Kolejnym krokiem jest dodanie strony do menu ustawień. Dokonujemy tego poprzez obsługę zdążenia CommandsRequested, w metodach OnLaunched(), OnSearchActivated dodajemy nasłuchiwanie zdarzenia.

// Register handler for CommandsRequested events from the settings pane
SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;

Natomiast samo dodanie już strony do menu wygląda następująco.

void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)
{
    var about = new SettingsCommand("about", "About", (handler) =>
        {
            var settings = new SettingsFlyout();
            settings.ShowFlyout(new AboutUserControl());
        });

    args.Request.ApplicationCommands.Add(about);
}

Dodawanie polecenia do menu ustawienia dokonuje się przez dodanie obiektu SettingsCommand do kolekcji ApplicationCommands. Trzeci parametr konstruktora SettingsCommand to obsługa, która jest wywoływana, gdy polecenie jest wywoływane w menu. W tym miejscu, używamy klasy SettingsFlyout aby określić jakie ma ustawienia wyświetlana strona. Można tę klasę używać wielokrotnie w projekcie i zmieniać jedynie wygląd strony. Natomiast wygląd strony jest definiowany przy pomocy kontrolki którą dodaje się przy pomocy metody ShowFlyout.  W metodzie OnCommandsRequested() możemy dodawać więcej stron jeśli jest taka potrzeba. Wracając do wyglądu do projektu dodaje się nowy obiekt UserControl.

image

Warto pamiętać o przycisku wstecz aby muc wrócić do strony poprzedniej w menu. Kod akcji kliknięcia przycisku wstecz prezentuje się tak.

private void OnBackButtonClicked(object sender, RoutedEventArgs e)
{
    if (this.Parent.GetType() == typeof(Popup))
    {
        ((Popup)this.Parent).IsOpen = false;
    }
    SettingsPane.Show();
}

Natomiast efekt prezentuje się następująco.

Untitled1

Untitled

W przypadku jak tworzymy bardziej skomplikowaną stronę z ustawieniami czyli interaktywną np.: z przyciskami. zapis ustawień odbywa się w kontrolce którą zdefiniowaliśmy jako wygląd strony. Natomiast odczyt to już w odpowiednich miejscach w aplikacji.

Post Navigation