После получения Visual Studio 2011 для работы с Windows 8 Consumer Preview я пытался разобраться в деталях WinRT / Metro. Сейчас я решил остаться с XAML-стороной, потому что это мне наиболее знакомо. Было интересно узнать, как повседневные задачи решаются с помощью WinRT по сравнению с такой платформой, как WP7.
С другой стороны: я не уверен, стоит ли мне говорить о написании «приложений в стиле Metro» вместо «WinRT-приложений». Полагаю, время покажет, что станет де-факто, но лично мне больше нравится WinRT.
Навигация по страницам
По сравнению с платформой Windows Phone 7, навигация между различными частями приложения очень похожа в WinRT. WinRT-приложение может содержать несколько страниц, и для навигации между ними требуется просто вызов метода Navigate . Что хорошо, так это то, что вам не нужно перемещаться с использованием URI, как в WP7, и вместо этого вы можете просто передать тип следующей страницы.
this.Frame.Navigate(typeof(BlankPage));
Учитывая, что мы создали проект Blank Application и добавили в него еще одну BlankPage, мы можем легко перейти с первой страницы на следующую:
<Grid> <Button Content="Navigation" Click="GoForward"/> </Grid>
private void GoForward(object sender, RoutedEventArgs e) { this.Frame.Navigate(typeof(AnotherPage)); }
Если мы запустим приложение, мы увидим, что навигация работает. Но пользователь не может вернуться назад.
Навигация назад
Переход к предыдущей странице еще проще, чем переход вперед. Со второй страницы нам просто нужно вызвать GoBack-метод :
this.Frame.GoBack();
Передача параметров
В Windows Phone 7 для передачи параметров между страницами требуется, чтобы параметры были добавлены в строку запроса перемещаемой страницы. В WinRT мы можем передавать объекты. Объект передается с использованием второго параметра метода Navigate:
this.Frame.Navigate(typeof(AnotherPage), customer);
На странице, к которой мы перешли, мы можем получить доступ к объекту, используя NavigationEventArgs.Parameter :
protected override void OnNavigatedTo(NavigationEventArgs e) { var cust = e.Parameter as Customer; }
Навигация назад по нескольким страницам
Навигация по нескольким страницам в WinRT проще, чем в WP7. Мы можем вызывать метод GoBack несколько раз в цикле. В WP7 это вызовет исключение. Учитывая ситуацию, когда мы добавляем третью страницу в приложение и хотим, чтобы она имела кнопку «Перейти домой», мы можем вызвать следующий код, который переместит пользователя обратно на первую страницу:
while (this.Frame.CanGoBack) { this.Frame.GoBack(); }
Определение первой страницы
В WinRT начальная страница приложения может быть настроена через App.xaml.cs. Замена BlankPage на AnotherPage заставляет наше приложение запускаться со второй страницы:
protected override void OnLaunched(LaunchActivatedEventArgs args) { if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from previously suspended application } // Create a Frame to act navigation context and navigate to the first page var rootFrame = new Frame(); rootFrame.Navigate(typeof(AnotherPage)); // Place the frame in the current Window and ensure that it is active Window.Current.Content = rootFrame; Window.Current.Activate(); }