2010-10-31 2 views
4

Я разрабатываю приложение Silverlight wp7. Я точно не знаю, как делать навигацию.Windows Phone 7/Silverlight: Как сделать навигацию?

У меня есть несколько классов PhoneApplicationPage, которые содержат несколько UserControl. Похоже, я могу использовать NavigationService для перехода от классов PhoneApplicationPage, но не к классам UserControl. Это предпочтительнее? Является ли общий шаблон не ориентироваться непосредственно с UserControl, но для его обработки с PhoneApplicationPage?

В настоящее время у меня есть коллекция контента, разделенная на разделы. Каждая секция имеет свой собственный PivotItem в PivotControl. Содержимое для каждого раздела находится в ListBox. Я завернул ListBox в UserControl, чтобы обеспечить немного больше функциональности/управления контентом. Однако похоже, что я не могу перейти непосредственно из этого класса.

Я мог бы удалить оболочку и просто разместить функциональность на сводной странице напрямую. Но что, если я хочу повторить список содержимого в другом месте моего приложения?

В качестве альтернативы, я передаю NavigationService на номер UserControl, когда он построен PhoneApplicationPage.

ответ

2

В WPF это было бы просто: вы бы вызвали статический метод на NavigationService, чтобы получить ответ: NavigationService.GetNavigationService(this).

К сожалению, это, похоже, не доступно в WP7.

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

var service = ((Application.Current as App).RootFrame.Content as Page).NavigationService; 
0

Я сделал пользовательский UserControl для этого:

использование
public class UserControlWithNavigation :UserControl 
{ 
    public event EventHandler NavigateToPageEvent; 

    public void NavigateToPage(Uri uri) 
    {    
     var e = new NavigationEventArgs(null, uri); 
     if (NavigateToPageEvent != null) 
      NavigateToPageEvent(this, e); 
    } 
} 

XAML класса пользовательских UserControl:

<common:UserControlWithNavigation  
    xmlns:common="clr-namespace:NameSpace;assembly=AssemblyName" 

и в моей странице

MyUserControl.NavigateToPageEvent += (s, e) => 
{ 
     NavigationService.Navigate(((NavigationEventArgs)e).Uri); 
}; 

Как вы видите, вы должны дать ваш UserControl имя (MyUserControl в приведенном выше примере)

2

В WP7, то RootVisual всегда является PhoneApplicationFrame, а с NavigationService и Frame (или PhoneApplicationFrame) разделяют почти все их методы/свойства (намеренно), вы можете сделать это:

(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(...whatever...); 
0

Я сделал образец навигации с использованием MVVM Light на http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html. Он может использовать некоторый рефакторинг, а некоторые предпочитают помещать некоторые вспомогательные функции навигации в другой класс, отличный от базовой страницы. Это достаточно легко сделать, и это может дать некоторые идеи.

Смежные вопросы