无法使用 c# 导航到 Windows Metro App 上的页面

Posted

技术标签:

【中文标题】无法使用 c# 导航到 Windows Metro App 上的页面【英文标题】:Not able to navigate to pages on Windows Metro App using c# 【发布时间】:2012-11-29 06:59:01 【问题描述】:

当我的UserLogin 页面加载时,我想检查用户数据库,如果它不存在或无法读取,我想将其定向到NewUser 页面。

protected override void OnNavigatedTo(NavigationEventArgs e)

    CheckForUser();
    if (UserExists == false)
        this.Frame.Navigate(typeof(NewUser));

问题是它永远不会导航到NewUser,即使我注释掉if 条件。

【问题讨论】:

你查过MSDN吗**这里是链接msdn.microsoft.com/en-us/library/windows/apps/br211386.aspx** 我不认为您可以在 OnNavigatedTo 方法中导航,因为您仍在导航中。 【参考方案1】:

Navigate 不能直接从OnNavigatedTo 方法调用。您应该通过Dispatcher 调用您的代码,它会起作用:

protected override void OnNavigatedTo(NavigationEventArgs e)

    base.OnNavigatedTo(e);
    CheckForUser();
    if (UserExists == false)
        Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
                            () => this.Frame.Navigate(typeof(NewUser)));

【讨论】:

确保在覆盖方法调用的顶部调用 base.OnNavigatedTo(e)。我有同样的代码,减去 base.OnNavigatedTo(e) 并且我仍然遇到异常。这个答案帮助了我,谢谢!【参考方案2】:

发生这种情况是因为您的应用尝试在当前帧完全加载之前进行导航。 Dispatcher 可能是一个不错的解决方案,但您必须遵循以下语法。

使用 Windows.UI.Core;

    private async void to_navigate()
    
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => this.Frame.Navigate(typeof(MainPage)));
    
    将 MainPage 替换为您想要的页面名称。 调用此 to_navigate() 函数。

【讨论】:

【参考方案3】:

你可以试试这个,看看是否有效

frame.Navigate(typeof(myPage)); // the name of your page replace with myPage

完整示例

    var cntnt = Window.Current.Content;
    var frame = cntnt as Frame;

    if (frame != null)
     
        frame.Navigate(typeof(myPage));
    
    Window.Current.Activate();

如果您想使用 Telerik 之类的第 3 方工具,也可以试试这个链接

Classic Windows Forms, Stunning User Interface

【讨论】:

【参考方案4】:

我看到你重写 OnNavigatedTo 方法但不调用基本方法。这可能是问题的根源。 尝试在任何逻辑之前调用基本方法:

protected override void OnNavigatedTo(NavigationEventArgs e)

    base.OnNavigatedTo(e);
    CheckForUser();
    if (UserExists == false)
        this.Frame.Navigate(typeof(NewUser));

【讨论】:

【参考方案5】:

使用 Dispatcher.RunIdleAsync 将导航推迟到另一个页面,直到 UserLogin 页面完全加载。

【讨论】:

【参考方案6】:

其他的都是正确的,但是由于 Dispatcher 不能在视图模型中工作,所以这里是如何做到的:

SynchronizationContext.Current.Post((o) =>

    // navigate here
, null);

【讨论】:

以上是关于无法使用 c# 导航到 Windows Metro App 上的页面的主要内容,如果未能解决你的问题,请参考以下文章

无法消除 Windows 8 Metro 'ListView' 中 Tiles 之间的填充/边距

Metro 应用程序中 C++ 和 C# 之间的通信

如何在 Metro 应用程序中为组合框添加颜色?

使用 powershell 启动 Metro 风格的应用程序

Windows Store Metro APP如何适配屏幕大小

Windows 8 Metro 应用程序键盘位置更改