Многостраничные приложения в Silverlight - Как страница получает экземпляр PageSwitcher

ОГЛАВЛЕНИЕ

Как страница получает экземпляр PageSwitcher

Для того, чтобы одна страница переходила к другой, она должна вызвать метод Navigate для PageSwitcher. Существует два подхода. Тот, который я буду использовать заключается в том, что страница (Page) будет запрашивать о своем родителе, который будет возвращать экземпляр PageSwitcher (поскольку страница на самом деле является содержимым PageSwitcher). Это не так просто и подразумевает, что страница знает больше об архитектуре, чем должна, и при этом повторяет запросы и код конвертирования на всех страницах.

Более элегантным решением будет использование посредника: статический класс, названный Switcher (переключатель), который будет инициализирован с экземпляром PageSwitcher , при этом каждой странице понадобится использовать одну строку для навигации. Это не только выглядит более элегантно, но и позволяет легче управлять и масштабировать, а также предоставляет хорошую инкапсуляцию.

Класс Switcher имеет две перегрузки своего статического метода Switch. Как вы уже наверно догадываетесь, один получает UserControl, а другой - UserControl и объект. Без проверок на исключительные ситуации это выглядит следующим образом:

public static class Switcher
 {
    public static PageSwitcher pageSwitcher;
 
    public static void Switch( UserControl newPage )
    {
         pageSwitcher.Navigate( newPage );
    }
 
    public static void Switch( UserControl newPage, object state )
    {
       pageSwitcher.Navigate( newPage, state );
    }
 }

Вы можете заметить, что его работой является прилегать к классу pageSwitcher и затем просто вызывать метод Navigate экземпляра. Это упрощает реализацию переключения  между страницами. Следующая строка является кодом для переключения к странице Search и передаче списка слов:

Switcher.Switch ( new Search(), words );

Все механизмы манипуляции содержимым пользовательского элемента управления PageSwitcher, а также передачи объекта, являются должным образом сокрыты от вызывающего класса, и поскольку Switch является статическим методом, то нет необходимости в создании экземпляра Switcher, что очень удобно.