C# Silverlight-如何从用户控件导航到普通页面?

C# Silverlight-如何从用户控件导航到普通页面?,c#,.net,silverlight,windows-phone-7,C#,.net,Silverlight,Windows Phone 7,如果在用户控件中执行此操作: NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative)); 它说这个错误: 非静态字段、方法或属性“System.Windows.Navigation.NavigationService.Navigate(System.Uri)”需要对象引用 多谢各位 我解决了将普通页面作为参数传递给用户控件的问题,这样我就可以获得NavigationService。NavigationSer

如果在用户控件中执行此操作:

NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative));
它说这个错误:

非静态字段、方法或属性“System.Windows.Navigation.NavigationService.Navigate(System.Uri)”需要对象引用

多谢各位



我解决了将普通页面作为参数传递给用户控件的问题,这样我就可以获得NavigationService。

NavigationService是一个类。Navigate是一种可以在该类的实例上调用的方法。它不是可以从对象引用外部调用的静态方法


基本上,您需要获取当前页面的当前导航服务。此链接应该会有所帮助。

NavigationService是Silverlight中页面对象的属性,这就是您出现此错误的原因。它不是Silverlight中UserControl的属性

以下是一些能够解决您看到的问题的选项

  • 将usercontrol视为控件。给它一个事件,当点击按钮时它将触发该事件。页面可以侦听该事件,并在触发时处理导航

  • 您可以允许页面访问其父级,也可以将导航服务从页面传递给usercontrol

  • 您也可以使用消息传递进行设置,但这将更加复杂。许多MVVM框架都有消息传递功能。有


  • 我通常使用事件处理程序。例子: 在用户控件中,定义如下内容

    public event EventHandler goToThatPage;
    
    您将调用以下示例中的控件:

    goToThatPage(this, new EventArgs());
    
    然后在MainPage.xaml.cs的构造函数中(如果包含用户控件),您将定义:

    uxControlName.goToThatPage+= new EventHandler(ControlGoToThatPage);
    
    在MainPage.xaml.cs的某个地方,您最终声明要执行的操作:

        void ControlGoToThatPage(object sender, EventArgs e)
        {
            this.NavigationService.Navigate(new Uri("/Pages/ThatPage.xaml", UriKind.Relative));
        }
    

    我知道这很旧,但我在Silverlight应用程序上也遇到过同样的情况。我想做一些类似于迪帕克的回答的事情,但我很长时间都不明白为什么在我的情况下它不起作用

    结果我需要调用刷新,而不是导航;因为我最初认为,如果URI与当前页面相同,navigate将重新加载页面。原谅我的初学者

    (((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh();
    

    以下是Silverlight for Windows Phone 8的另一个解决方案:

    public Page Page { get; set; }
    



    嗯,在UserControl中,我有一个按钮,当它被单击时,我导航到另一个页面。你可以使用HyperlinkButton而不是常规按钮吗?我会说,不要从控件导航,而是给页面一个事件,并允许页面导航。您的控件应该只提供输入,而不提供控件导航。谢谢。这帮了我一个解决方案…而且是一个很好的、整洁的方法!我尝试了瓦利德的解决方案。这解决了我的问题……多年来我一直在寻找解决办法。导航框架是MVVM开发的砖墙。我发现的唯一解决办法是我拒绝使用的令人厌恶的黑客!我不想我的网页有任何导航知识!什么是PhoneApplicationFrame?在我的代码中,我有App.xaml,它调用Main.xaml Main.xaml是UserControl,我想从那里使用导航。
    ((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame"))
        .Navigate(new Uri("Page Name", UriKind.Relative));
    
    (((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh();
    
    public Page Page { get; set; }
    
    this.Loaded += delegate
    {
        Page = (Application.Current.RootVisual as Frame).Content as Page;
    };
    
    Page.NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative));