Xamarin.Forms禁用推送页面中的幻灯片菜单

时间:2015-05-06 17:25:51

标签: xamarin xamarin.forms

我使用Xamarin.Forms(版本1.4)

页面层次结构:

  

- > NavigationPage

     

- > MasterDetailPage

如何在推送屏幕中禁用滑动菜单(通过手势打开母版页)?

推送方法:

  

await((NavigationPage)((MasterDetailPage)Application.Current.MainPage).Detail).PushAsync(page))

滑动菜单只能在根页面上使用。

2 个答案:

答案 0 :(得分:3)

MasterMenuPage包含一个名为" IsGestureEnabled"的bool属性。这决定了菜单中的滑动是否可用。

IsGestureEnabled = false //no swipe gesture

在这里,我可以为您提供一个自定义MasterDetailPage

的简单实现
public class MainMDPage : MasterDetailPage
    {
        public MainMDPage(Page masterPage, Page detailPage)
        {
            MasterBehavior = MasterBehavior.Popover;
            Master = masterPage;
            Detail = detailPage;
        }

        /// <summary>
        /// Pushes a page and disables the master menu.
        /// </summary>
        /// <param name="page"></param>
        /// <returns></returns>
        public async Task PushAsync(Page page)
        {
            if(Detail is NavigationPage navPage)
            {
                await navPage.PushAsync(page);
                IsGestureEnabled = false;
            }
        }

        /// <summary>
        /// Pops a page and enables the master menu if we get to the root page.
        /// </summary>
        /// <returns></returns>
        public async Task PopAsync()
        {
            if (Detail is NavigationPage navPage)
            {
                await navPage.PopAsync();

                if (navPage.Navigation.NavigationStack.Count == 1)  //if count == 1 -> is root page
                    IsGestureEnabled = true;
            }
        }
    }

答案 1 :(得分:0)

在我的应用中,我拥有继承自MasterDetailPage的“RootPage”。这是我的应用程序的MainPage。我有一个“MenuPage”,它继承自创建菜单项的ContentPage。我在“RootPage”中将其设置为Master。然后我创建一个新的NavigationPage,将带有列表视图的页面传递给构造函数。然后我将Detail设置为NavigationPage。在列表视图页面中,OnItemSelected我使用Navigation.PushAsync(detailsPage)导航。按照这种模式,当detailsPage加载时,iOS中没有“汉堡包/滑动菜单”,而只能返回上一页(列表视图)。以下是代码示例:

public class RootPage : MasterDetailPage {
    MenuPage menuPage;

    public RootPage() {
        menuPage = new MenuPage();
        menuPage.Menu.ItemSelected += (sender, e) => 
                  NavigateTo(e.SelectedItem as Model.MenuItem);

        Master = menuPage;
        Detail = new NavigationPage(PlayerListPage());
    }
}

public class PlayerListPage : ContentPage {
    protected async void OnItemSelected(object sender, ItemTappedEventArgs e) {
        var item = e.Item as PlayerViewModel;
        var selected = new PlayerPage(item) {
            BindingContext = item
        };

        await Navigation.PushAsync(selected);
    }
}

public class MenuPage : ContentPage {
    public ListView Menu { get; set; }

    public MenuPage() {
        Icon = "menu.png";
        Title = "menu"; // The Title property must be set.
        var menuItems = new List<MenuItem> {
            new MenuItem { 
                Title = "Players", 
                IconSource = "people.png", 
                TargetType = typeof(PlayerListPage)
            },
        };

        Menu = new ListView { 
            ItemsSource = menuItems,
        };
    }
}

public class MenuItem {
    public string Title { get; set; }
    public string IconSource { get; set; }
    public Type TargetType { get; set; }
}

这是你想要达到的目标吗?如果没有,那么您可以通过disable the sliding menu澄清您的意思,并提供更多代码示例。