Многостраничные приложения в Silverlight - Нажатие на кнопку изменения (Change)

ОГЛАВЛЕНИЕ

Нажатие на кнопку изменения (Change)

При нажатии на кнопку вызывается обработчик события,

Switcher.Switch( new Page2(), Name.Text );

Элемент управления опять переходит к статическому методу Switch, но на этот раз вызывая второй перегруженный метод, и передавая ему UserControl и объект. Поскольку объект является корнем для всех классов, то он с радостью примет передаваемую строку.

Обратите внимание на то, что создается новый экземпляр Page2(). Вы заметите, что это заменяет содержимое объекта PageSwitcher (Page), и поэтому старое содержимое будет удалено. Мы очень рассчетливы, когда дело касается пользовательской памяти.

Switch предстоит выполнить некоторую работу. Он устанвливает свое содержимое, но затем ему необходимо вызвать UtilizeState для новой страницы, передавая состояние, которое он получил. К сожалению, он не может вызвать данный метод для UserControl, потому он должен осуществлять преобразование, тестируя для того, чтобы обеспечить то, что UserControl на самом деле реализует ISwitchable.

Оператор as возвратит экземпляр класса, который реализует интерфейс, если данный класс на самом деле реализует интерфейс, либо же он возвратит null в противном случае.

ISwitchable s = nextPage as ISwitchable;
if ( s != null )
{
  s.UtilizeState( state );
}

На объект ссылаются как на экземпляр типа ISwitchable, но конечно же, это всего лишь условное обозначение для выражения “s является экземпляром класса, который реализует ISwitchable”. В любом случае, s теперь может вызывать метод UtilizeState содержащийся в ISwitchable, что оно и делает, передавая полученный объект.

Обратите внимание на то, что нет возможности в C# создавать объект типа Interface. Поэтому вы можете написать

ISwitchable s = new ISwitchable();

Тут мы просто создаем ссылку, которая означает “класс, который реализует данный интерфейс” и указывает данную ссылку на объект, который уже существует .

Данный вызов UtilizeState статическим методом Switcher избавляет нас от необходимости осуществления явного запроса от UserControl к UserState, тем самым UserControl не должен даже знать о существовании PageSwitcher.

Также обратите внимание на то, что PageSwitcher - всего лишь курьер, и он никогда не исследует содержимое объекта, не знает какого он типа, и не хранит его; PageSwitcher просто принимает объект от вызывающей страницы и передает его в метод UtilizeState вызванной страницы.

UtilizeState в данном случае присваивает объект, посланный свойству Text элемента textBlock Messsage. Поскольку мы знаем о том, что объект состояния является строкой, то нам не нужно осуществлять данное присвоение, но нам все равно необходимо осуществить преобразование либо вызвать ToString,

public void UtilizeState( object state )
{
  Message.Text = state.ToString();
}

Очень важно соблюдать порядок операций, но он полностью автоматический. Page2 создается на вызове Switch, тем самым вызывается его конструктор, и его компоненты инициализируются до того, как PageSwitcher попытается вызвать метод UtilizeState (очень хорошая вещь, поскольку в противном случае метод не сработал бы), тем не менее, UtilizeState вызывается до того, как PageSwitcher отобразит новое содержимое, поэтому состояние было использовано вовремя для того, чтобы отобразить его пользователю.