【问题标题】:Xamarin.Forms Disable slide menu in pushed pageXamarin.Forms 在推送页面中禁用幻灯片菜单
【发布时间】:2015-07-16 23:54:55
【问题描述】:

我使用 Xamarin.Forms(1.4 版)

页面层次结构:

->导航页

-->MasterDetailPage

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

推送方式:

等待((NavigationPage)((MasterDetailPage)Application.Current.MainPage).Detail).PushAsync(page))

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

【问题讨论】:

  • 嗨,BooMik,你有解决这个问题的方法吗?我也面临同样的问题。你有什么解决办法吗?

标签: xamarin xamarin.forms


【解决方案1】:

在我的应用程序中,我有从 MasterDetailPage 继承的“RootPage”。这是我的应用程序主页。我有一个从创建菜单项的 ContentPage 继承的“MenuPage”。我在“RootPage”中将其设置为 Master。然后我创建一个新的 NavigationPage,将带有列表视图的页面传递给构造函数。然后我将详细信息设置为 NavigationPage。在列表视图页面中,我使用 Navigation.PushAsync(detailsPage) 导航 OnItemSelected。按照这种模式,当 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 的含义并提供更多代码示例。

【讨论】:

  • 我尝试了您的解决方案,但幻灯片菜单显示在所有页面中。我正在 Windows Phone 中进行测试。我希望幻灯片菜单仅显示在根页面上。目前它显示在所有页面中。
【解决方案2】:

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;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多