从C#代码导航到主详细信息页面

时间:2019-08-01 10:25:43

标签: c# xamarin.forms

我在导航到MasterDetailPage时遇到问题。我知道如何使用按钮从xaml进行操作:

<Button IsVisible="False" Grid.Row="6" x:Name="Start" Text="START" 
VerticalOptions="Center" Margin="0,0,0,15" HorizontalOptions="Center" 
Command="{Binding Path=NavigateCommand}" 
CommandParameter="/MasterDetail/NavigationPage/MainPage" />

但是如何使用后面的代码实现相同的目标?

我正试图这样做:

MasterDetailPage mdet;
Page detpage;
Page mastpage;

mdet = new MasterDetailPage();
detpage = new MainPage();
mastpage = new MasterDetail();
mdet.Master = mastpage;
mdet.Detail = detpage;
App.Current.MainPage = mdet;

但是结果是:

  

System.InvalidOperationException:在将MasterDetailPage添加到容器之前,必须先设置Master和Detail

编辑。 抱歉,我不清楚地写了这个问题。为了阐明我需要达到的目标: 我有一个页面,该页面在应用程序启动时显示。在OnAppearing方法中,我正在检查一些条件。如果不符合要求,则将使用带有Command="{Binding Path=NavigateCommand}"CommandParameter="/MasterDetail/NavigationPage/MainPage"的Button显示初始页面。但是如果满足条件,我想直接进入MainPage(实现与单击提到的按钮但未单击的相同操作)

编辑2。 我有两个页面,MasterDetail是MasterDetailPage的类型,具有在xaml中定义的母版部分,而MainPage是ContentPage,并作为详细信息部分添加到MasterDetail中。当我添加代码Navigation.PushModalAsync(new MasterDetail());时,什么都没有发生。要做出任何回应,我需要执行Navigation.PushModalAsync(new MainPage());

var MaDe = new MasterDetail();
MaDe.Detail = new MainPage();
Navigation.PushModalAsync(MaDe);

但是在显示详细信息页面后的两个选项中,某些按钮均不起作用。我有4个按钮(实际上是4个带有TapGestureRecognizers的网格),它们的代码相似:

private async void TapImage_Tapped1(object sender, System.EventArgs e)
    {
        if (App.Current.Properties.ContainsKey("Boxisconf1"))
        {
            var masterDetail = App.Current.MainPage as MasterDetailPage;

            if (masterDetail == null || masterDetail.Detail == null)
                return;

            var navigationPage = masterDetail.Detail as NavigationPage;
            if (navigationPage == null)
            {
                masterDetail.Detail = new NavigationPage(new Box1());
                masterDetail.IsPresented = false;
                return;
            }

            var NavPage = new Box1();
            NavPage.Title = "Part 1";

            switch (isInsideButOutside1)
            {
                case 0:
                    NavPage.Children.Add(new Letter1 {});
                    NavPage.Children.Add(new Parcel1 {});
                    NavPage.Children.Add(new Exit1 { });
                    break;
            (...)
            }

            await navigationPage.Navigation.PushAsync(NavPage);

            navigationPage.Navigation.RemovePage(navigationPage.Navigation.NavigationStack[navigationPage.Navigation.NavigationStack.Count - 2]);
            masterDetail.IsPresented = false;
        }
        else
        {
            await Navigation.PushAsync(new Configure());
        }
    }

并且在App.Current.Properties.ContainsKey(“ Boxisconf1”)为true的情况下,如果(masterDetail为null)并且如果第一个条件为false,则该函数在下一个返回;我得到一个异常:{{1 }}

1 个答案:

答案 0 :(得分:0)

您是否想像这样的GIF用C#实现结果?  enter image description here

这是代码。

  var btn=new Button();
        btn.CommandParameter = new MasterDetailPage1();
        btn.Command = new Command<MasterDetailPage1>((key) =>
         {
             Navigation.PushAsync(key);
         });

如果您不想在app.xaml中新建导航。

您可以只使用以下代码。

   var btn=new Button();
        btn.CommandParameter = new MasterDetailPage1();
        btn.Command = new Command<MasterDetailPage1>((key) =>
         {
            // Navigation.PushAsync(key);
             Navigation.PushModalAsync(key);
         });

此处正在运行GIF。

enter image description here

修改 只需判断标志,如果符合条件就可以导航到其他页面。如果不符合条件,请显示一个按钮。

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        bool IsMeet = true ;
        if (IsMeet)
        {
            Navigation.PushModalAsync(new MasterDetailPage1());
        }
        else
        {
            var btn = new Button();
            btn.CommandParameter = new MasterDetailPage1();
            btn.Command = new Command<MasterDetailPage1>((key) =>
            {
                // Navigation.PushAsync(key);
                Navigation.PushModalAsync(key);
            });

            //  btn.Clicked += Btn_Clicked;
            Content = btn;

        }

    }