Многостраничные приложения в 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, что очень удобно.