2017-02-20 5 views
0

У меня есть просмотр содержимого и левый навигационный ящик, который является достоянием на 4 страницах, а в представлении «Содержание» есть 4 значка, которые перемещаются между 4 различными страницами. Я хочу сохранить обзор содержимого и оставить навигационный ящик на всех 4 страницах. Я создаю страницу основных деталей и устанавливаю главную страницу в левый навигационный ящик, и каждый раз меняю страницу сведений. Я получил исключение, так как андроид может перемещаться только по одной странице одновременно, перемещаясь между несколькими страницами. Ниже мой корневой страницы и ContentView PageПеремещение между несколькими страницами в Xamarin.forms?

public class RootPage : MasterDetailPage 
    { 
     LeftNavigationPanel menuPage; 
     public RootPage(string detailSel) 
     { 
      menuPage = new LeftNavigationPanel(); //This is the left navigation class. rename later. 
      Master = menuPage; 
      if (detailSel.Equals("")) 
      { 

       var detail = new NavigationPage(new Tabpage()); 
       Detail = detail; //homepage 
       detail.Icon = "leftnav.png"; 
       App.navigation = detail.Navigation; 
      } 
      else if (detailSel.Equals("1")) 
      { 

       var detail = new NavigationPage(new Post()); 
       Detail = detail; //homepage 
       detail.Icon = "leftnav.png"; 
       App.navigation = detail.Navigation; 
      // System.Diagnostics.Debug.WriteLine("page1: " + Navigation.NavigationStack[Navigation.NavigationStack.Count-1]); 

      } 
      else if (detailSel.Equals("2")) 
      { 
       var detail = new NavigationPage(new TrackTabPage()); 
       Detail = detail; //homepage 
       detail.Icon = "leftnav.png"; 
       App.navigation = detail.Navigation; 
       // System.Diagnostics.Debug.WriteLine("page1: " + Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]); 

      } 
      } 
    } 

ContentView

public partial class HomeContentView : ContentView 
    { 
     public HomeContentView() 
     { 
      InitializeComponent(); 
     } 
     private async void read_click(Object sender, EventArgs e) 
     { 
      if (!((Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]) is Tabpage)) 
      { 

       //await Navigation.PopAsync(); 
       await Navigation.PushAsync(new RootPage("")); 
       // this.Navigation.PopAsync(); 
      } 
     } 
     private async void post_click(Object sender, EventArgs e) 
     { 
      if (!((Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]) is Post)) 
      { 
       System.Diagnostics.Debug.WriteLine("page: "+ Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]); 
       // await Navigation.PopAsync(); 
       await Navigation.PushAsync(new RootPage("1")); 


      } 
     } 
     private async void track_click(Object sender, EventArgs e) 
     { 
      if (!((Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]) is TrackTabPage)) 
      { 
       System.Diagnostics.Debug.WriteLine("page: " + Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]); 
       // await Navigation.PopAsync(); 
       await Navigation.PushAsync(new RootPage("2")); 
      } 
     } 
     private void play_click(Object sender, EventArgs e) { } 
    } 

ответ

0

Вы должны использовать Navigation из Detail-страницы, потому что вы установите Detail как new NavigationPage().

Я обычно использую следующий код для Geht в INavigation для навигации внутри моего приложения:

public static INavigation GetNavigation() 
{ 
    var mdp = Application.Current.MainPage as MasterDetailPage; 
    if (mdp != null) 
    { 
     // Return the navigation of the detail-page 
     return mdp.Detail.Navigation; 
    } 

    var np = Application.Current.MainPage as NavigationPage; 
    if (np != null) 
    { 
     // Page is no MasterDetail-Page, but has a navigation 
     return np.Navigation; 
    } 

    // No navigation found (just set the page, instead of navigation) 
    return null; 
} 

И использовать его как в следующем примере:

var nav = GetNavigation(); 
if(nav != null) 
{ 
    await nav.PushAsync(new Tabpage()); 
} 
else 
{ 
    // Just set the page, because there is no navigation 
    Application.Current.MainPage = new new Tabpage(); 

    // Or like this 
    Application.Current.MainPage = new NavigationPage(new Tabpage()); 
} 

Update

я изменил мой ответ немного (спасибо за комментарий, я просто этого не понимаю). Не используйте new Rootpage(""), чтобы изменить страницу. С этим вы создаете новую навигацию поверх текущей навигации .. это не имеет смысла.

Только Push Ваша страница на текущей навигации вы получаете по GetNavigation().

Пожалуйста, прочтите documentation about the navigation pattern в Xamarin.Forms для получения более подробной информации.

+0

Что я должен писать в конструкторе корневой страницы? могу я держать его как есть? – sid

+0

Это зависит от того, как вы хотите перемещаться внутри своего приложения. В «нормальном» случае у вас есть одна «NavigationPage», в которую вы нажимаете новые страницы. При этом пользователь может вернуться назад. Я обновил свой ответ – Joehl

+0

в своем приложении. На всех основных 4 страницах постоянно размещаются 4 значка, которые занимаются навигацией между 4-мя основными страницами ... и функциональность похожа ... вы можете перейти на любую страницу с любой текущей страницы щелкнув по соответствующему значку .. нет никого, кто решит поток .. как я могу сделать такие навигационные – sid

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