我用來爲我的應用程序,邊欄導航和父子導航同時實現兩種類型的導航。 我的應用程序以漢堡(側邊欄)菜單開始。MvvmCross MvvmCross 5.x的側欄導航
邊欄菜單中的第一項應執行導航堆棧的重置並打開主頁視圖。 主視圖控制器應該啓動根堆棧導航,因此主視圖上的每個按鈕應打開一個新視圖,新視圖上的按鈕應打開另一個視圖等。
邊欄菜單中的每個其他項目都應打開一個新視圖一個對話框。
我使用MvvmCross 5.x,並且沒有與5.x版本兼容的示例。 有沒有人能指點我一個可用的樣本?
我用來爲我的應用程序,邊欄導航和父子導航同時實現兩種類型的導航。 我的應用程序以漢堡(側邊欄)菜單開始。MvvmCross MvvmCross 5.x的側欄導航
邊欄菜單中的第一項應執行導航堆棧的重置並打開主頁視圖。 主視圖控制器應該啓動根堆棧導航,因此主視圖上的每個按鈕應打開一個新視圖,新視圖上的按鈕應打開另一個視圖等。
邊欄菜單中的每個其他項目都應打開一個新視圖一個對話框。
我使用MvvmCross 5.x,並且沒有與5.x版本兼容的示例。 有沒有人能指點我一個可用的樣本?
我首先假設你正在嘗試爲iOS實現這個功能。在Android的情況下,你可以簡單地使用導航抽屜。
iOS上的示例尚未轉換爲MvvmCross 5.x(我將開始這樣做a.s.a.p.),但這應該是微不足道的。讓我儘量走你通過它:
Install-Package MvvmCross.iOS.Support -Version 5.0.2
(或使用GUI)配置您的iOS項目通過向使用MvxSidebarPresenter
下面的代碼到Setup
類在iOS項目:
protected override IMvxIosViewPresenter CreatePresenter()
{
return new MvxSidebarPresenter((MvxApplicationDelegate)ApplicationDelegate, Window);
}
創建爲你彈出菜單,並與MvxSidebarPresentationAttribute
裝飾它作用一個視圖控制器。這個視圖控制器將作爲你的菜單。您可以(或更好地)將其鏈接到將處理導航部分的視圖模型(當用戶選擇菜單項時)。此視圖控制器可能是這個樣子:
[MvxSidebarPresentation(MvxPanelEnum.Left, MvxPanelHintType.PushPanel, false)]
public class LeftPanelView : MvxViewController<LeftPanelViewModel>
{
...
}
爲了確保您的主頁視圖充當根控制器,只需將MvxSidebarPresentationAttribute
添加到主視圖控制器,並確保財產Panel
設置爲Center
,HintType
是設置爲ResetRoot
和ShowPanel
設置爲true
),像這樣:
[MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true)]
public class HomeView : MvxViewController<HomeViewModel>
{
...
}
對於所有子視圖(從主視圖中打開),請確保您設置的MvxSidebarPresentationAttribute
與道具erty Panel
設置爲Center
,HintType
設置爲PushPanel
和依賴,如果你想顯示的子頁面菜單按鈕設置
,就像這樣:ShowPanel
到
true
或
false
[MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.PushPanel, true)]
public class ChildView : MvxViewController<ChildViewModel>
{
...
}
的最後一步是爲菜單中的所有其他按鈕設置視圖控制器。這些可以簡單地用MvxModalPresentationAttribute
屬性進行修飾,以打開它們作爲對話框(詳細文檔可以在here找到)。一個例子可能是這個樣子:
[MvxModalPresentation(ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen, ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve)]
public partial class ModalView : MvxViewController<ModalViewModel>
{
...
}
要打開不同的觀點,你可以使用在MvvmCross新的導航服務。這樣做只是讓MvvmCross IoC容器注入一個實例到您的視圖模型構造(更多細節可以發現here):
public class HomeViewModel : MvxViewModel
{
private readonly IMvxNavigationService _navigationService;
public HomeViewModel(IMvxNavigationService navigationService)
{
_navigationService = navigationService ?? throw new ArgumentNullException(nameof(navigationService));
}
}
編輯1: 爲了能夠表現出作爲菜單的圖標按鈕,您需要在構成菜單的視圖控制器上實現IMvxSidebarMenu
界面(請參閱步驟3)。通過實現此接口,您可以覆蓋菜單的默認行爲,並且可以找到示例here(它是演示MvvmCross XamarinSidebar應用程序的一部分)。
編輯2: 我錯誤的認爲,可以顯示菜單(或它的圖標),在其上導航壓棧子視圖按鈕。情況並非如此,在堆棧上推送的子視圖不會顯示菜單按鈕。在這些情況下,ShowPanel
屬性完全被忽略。
EDIT 3: 有完全完成該圖案的一種方式。我們可以自定義堆棧導航UI,以便我們可以模仿Android工具欄。這種方法的工作原理,它基本上要求我們隱藏導航欄,並創建我們的自定義工具欄,它具有漢堡菜單,後退按鈕和其他按鈕,並將其放置在子視圖的上部。這是需要密切和後退按鈕的代碼:
public override void ViewDidLoad()
{
base.ViewDidLoad();
NavigationController.NavigationBarHidden = true;
btnClose.TouchUpInside += (object sender, EventArgs e) =>
{
NavigationController.NavigationBarHidden = false;
NavigationController.PopViewController(false);
};
btnShowMenu.TouchUpInside += (object sender, EventArgs e) =>
{
var sideMenu = Mvx.Resolve<IMvxSidebarViewController>();
sideMenu?.Open(MvxPanelEnum.Left);
};
}
我實現了幾乎所有使用您的指令變更榨渣樣的項目,但兩個問題仍然存在。 1.我沒有得到菜單按鈕(漢堡包),但只有單詞「菜單」。 2.當子頁面打開時,它具有導航欄(我可以使用NavigationController.NavigationBarHidden隱藏= false), ,但當子頁面處於活動狀態時,我看不到漢堡菜單,無論我設置showpanel = true還是showpanel =假)。 你可以在這裏找到我的測試項目: https://1drv.ms/u/s!ArCs7A3yxQw8pTdWUPhgF0EUTu-L –
我已更新我的原始帖子,以回答您的其他問題。不幸的是,我曾誤導你說過你可以在子視圖上顯示菜單圖標。 –
我感謝您的幫助。 您是否說我們無法在eBay或亞馬遜等應用程序中創建導航,其中導航到主菜單啓動某種堆棧導航,同時保留菜單面板並允許用戶隨時跳轉到主屏幕(對話框除外)。 有沒有其他方法可以幫助我完成這種導航模式。 –