2016-08-08 2 views
0

Как добавить контроллер UI на все страницы приложения? Например, имея тот же контроллер SplitView с навигационным меню в панели на всех страницах без копирования его кода xaml? Или, возможно, изменение App.xaml каким-то образом?Добавить контроллер ко всем страницам UWP

Или, в качестве второго варианта, можно создать UserControl, который содержит SplitView, и поместить в него все другие виды на этой странице? Содержимое? Я имею в виду, как помещать представления в UserControl в xaml (или даже в код)?

ответ

1

Создание пользовательских RootControl, который является производным от UserControl класса и который содержит корень Frame

<SplitView DisplayMode="CompactOverlay"> 
     <SplitView.Pane> 
     <StackPanel> 
      <AppBarButton Icon="Home" 
          Width="50" 
          MinWidth="50" 
          Click="OnHomeClicked" 
          /> 
      <AppBarButton Icon="Shop" 
          Width="50" 
          MinWidth="50" 
          Click="OnShopClicked"/> 
      <AppBarButton Icon="Setting" 
          MinWidth="50" 
          Width="50" 
          Click="OnSettingsClicked"/> 
     </StackPanel> 
     </SplitView.Pane> 
     <SplitView.Content> 
     <Grid> 
      <Frame x:Name="rootFrame"/> 

      <!--Put your hamburger button here--> 

     </Grid> 
     </SplitView.Content> 
    </SplitView> 

Rewrite OnLauched:

protected override void OnLaunched(LaunchActivatedEventArgs e) 
    { 

     var rootControl = Window.Current.Content as RootControl; 

     if (rootControl == null) 
     { 
      // Create a Frame to act as the navigation context and navigate to the first page 
      rootControl = new RootControl(); 

      rootControl.RootFrame.NavigationFailed += OnNavigationFailed; 

      if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 
      { 
       //TODO: Load state from previously suspended application 
      } 

      // Place the frame in the current Window 
      Window.Current.Content = rootControl; 
     } 

     if (rootControl.RootFrame.Content == null) 
     { 
      // When the navigation stack isn't restored navigate to the first page, 
      // configuring the new page by passing required information as a navigation 
      // parameter 
      rootControl.RootFrame.Navigate(typeof(MainPage), e.Arguments); 
     } 
     // Ensure the current window is active 
     Window.Current.Activate(); 
    } 

и вы можете управлять вами действия с фоновым кодом или ViewModel для навигация и другие действия

public sealed partial class RootControl : UserControl 
    { 
     private Type currentPage; 

     public RootControl() 
     { 
      this.InitializeComponent(); 
      RootFrame.Navigated += OnNavigated; 
     } 

     private void OnNavigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) 
     { 
      currentPage = e.SourcePageType; 
     } 

     public Frame RootFrame 
     { 
      get 
      { 
       return rootFrame; 
      } 
     } 

     private void OnHomeClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
     { 
      Navigate(typeof(MainPage)); 
     } 

     private void OnShopClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
     { 
      Navigate(typeof(StorePage)); 
     } 

     private void OnSettingsClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
     { 
      Navigate(typeof(SettingsPage)); 
     } 

     private void Navigate(Type pageSourceType) 
     { 
      if (currentPage != pageSourceType) 
      { 
       RootFrame.Navigate(pageSourceType); 
      } 
     } 
    } 

Download образец и посмотреть, как это работает

+0

Привет Он чувствует, как ваш пример, что мне нужно, но загрузка ссылка не работает –

+0

попробовать еще раз, я редактировал ссылку –

+0

Теперь он работает, спасибо много –

1

Похоже, вы за чем-то похожим на то, что предлагает Джерри Никсон в this article here.

Основная идея заключается в том, что вместо управления Frame, в котором размещается весь контент вашего приложения, вы создаете «оболочку» (в случае статьи, сделанной из SplitView, но на самом деле это может быть что угодно), которая имеет некоторый собственный контент, , а также элемент управления Frame (который затем содержит остальную часть вашего контента).

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