Frame.Navigate在LoadState中

时间:2014-09-26 10:52:39

标签: c# xaml windows-runtime windows-store-apps

我在尝试基于一点检查在Windows 8.1应用程序中的页面之间自动导航时遇到了问题。在LoadState执行此操作时,它只是不想导航到另一个页面,好像还没有加载某些内容,但它也没有给出错误。当我在执行await Task.Delay(2000)之前使用(例如)Frame.Navigate插入延迟时,我的应用会重定向而没有任何问题。

protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
    {
        MyData oData = await getData();

        if (oData != null)
        {
             this.Frame.Navigate(typeof(newPage), oData);
        }
        else
        {
             // do something else
        }

    }

我是否必须将此代码放入另一个加载或导航事件中?或者我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

LoadStateSaveState中,您应该只保存和恢复页面状态(在暂停和重新激活应用时调用)。别无他法(比如导航)。

将您的逻辑放入OnNavigatedTo方法而不是......

答案 1 :(得分:0)

如果要从加载页面时调用的方法导航,则应将导航代码放在OnNavigatedTo(...)上。但是不要忘记将代码包装在Dispatcher.RunAsync(...)中 - Frame navigation in xaml return false

答案 2 :(得分:0)

我尝试从 OnNavigatedTo 方法调用Frame.Navigate(...),但导航仍未发生。

还有其他答案表示使用 Dispatcher.RunAsync ,但感觉它正在假设有关Windows Phone的线程模型。

这就是我做的事情:将处理程序附加到页面的已加载事件,然后将我的“重定向”逻辑放在那里。在OnNavigateTo之后和NavigationHelper_LoadState之后,但在页面变为可见之前加载。

    public LaunchPadPage() {
        this.InitializeComponent();

        this.navigationHelper = new NavigationHelper(this);
        this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
        this.navigationHelper.SaveState += this.NavigationHelper_SaveState;

        this.Loaded += LaunchPadPage_Loaded;

        this.app = (App)App.Current;
    }

    private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e) {
        // Let's show the root zone items
        // NB: In case we don't have this data yet, do nothing
        if (app.Hierarchy != null)
        {
            DefaultViewModel["Items"] = app.Hierarchy.RootItems;
        }
    }

    private void LaunchPadPage_Loaded(object sender, RoutedEventArgs e) {
        // No data? Go to the downloads page instead.
        if (app.Hierarchy == null)
        {
            Frame.Navigate(typeof(DownloadingPage));
        }
    }