簡體   English   中英

使用Template10在頁面內導航

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM