[英]Navigation within Page using Template10
我有問題如何在UWP中實現子頁面導航。 該頁面位於RootFrame中,我可以在導航中使用。 但我想使用這樣的東西:
<Page>
<Grid>
<Frame x:Name="MyFrame"/>
</Grid>
</Page>
我想要的是,在ViewModel中使用控制MyFrame的Navigate方法。 我可以從代碼隱藏調用該方法,但我正在使用MVVM開發我的應用程序。 我不確定,如果Template10可以使用子幀。
我很感激任何建議。
編輯:更多細節:我在頁面中有樞軸控制。 樞軸有2個選項卡(pivotitems)。 pivotitem的內容必須是可導航的。 我的意思是:我的第一部分,我需要有一個框架並用它在樞軸實現中導航。 我的問題是,如何使用或如何從ViewModel調用pivotitem中的幀,特別是我需要調用Navigate方法。 現在我正在使用Template10的導航服務,它正在使用rootframe。 我不知道,如何將其用於其他讓我們說的子幀。
你總是可以這樣做。
var nav = Bootstrapper.NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude, this.Frame);
這將為您提供頁面中框架的導航服務。 如果願意,您可以使用會話狀態。
Bootstapper.SessionState["MyNav"] = nav;
從這里,您的視圖模型可以訪問服務並導航。 您可以重復此操作以獲得盡可能多的幀。 然后,您可以在視圖模型中處理導航,而無需考慮框架的“位置”,只需要您的邏輯需要導航。
這有意義嗎?
我不知道你將如何觸發導航更改,所以我認為它將從按鈕點擊開始。 我還假設按鈕的Command
屬性已經綁定到viewmodel中的ICommand
(相同的概念可以應用於不同類型的視圖)。
我們現在要做的就是讓ICommand
實現調用我們的自定義NavigationService
來執行內容切換。 這個NavigationService
類只不過是窗口全局框架的簡單代理。 它的主要導航方法可以簡單如下:
public void Switch()
{
var rootFrame = Window.Current.Content as Frame;
if ((rootFrame.Content as ParentPage) != null)
{
rootFrame.Navigate(typeof(ChildPage));
}
}
所以你用Template10標記了它,但它似乎是整個UWP的一個更普遍的問題。 我想知道你是否考慮過這種方法的所有固有的復雜性 - 特別是與暫停和恢復有關。 對於您擁有的每個幀,您需要保存和恢復導航狀態,當您有嵌套幀時,這不是直接的。 您是否也考慮過全球導航將如何運作?
模板10確實支持多個NavigationServices的概念,因此支持多個框架,但只有從您可以創建它們的角度來看。 Template10本身並不了解這些幀如何相互關聯,因此無法在以下情況下執行自動反向傳播:
FrameA [Main-> Page1->第1頁:Pivot1.FrameB [View1-> View2-> VIEW3]]
這里我們有兩個框架 - FrameA和FrameB。 FrameA已從Main導航到Page1。 Page1有一個Pivot,在PivotItem1中托管FrameB,FrameB已經從View1導航到View 2,從View2導航到View 3。
全局導航(即shell返回等)將自動連接到FrameA,因此您需要攔截該操作,然后處理您自己的FrameB導航活動。
看一下BackButtonBehavior ,看看如何攔截全局回來然后放置你自己的動作。
我不知道你是否可以做那樣的事情。一個可能的解決方法是使用一個Messenger從你的viewmodel發送消息到后面的視圖代碼..雖然我不是這個解決方案的粉絲,因為我在你必須使用頁面代碼之后說...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.