Silverlight NavigationService始终为空

时间:2010-04-26 09:07:48

标签: silverlight xaml navigation

我读到有些人遇到了这个问题所以我想发布一个(有点)优雅的解决方案,我试图解决这个问题。问题是当你在Silverlight中创建模板化页面而ContentControls没有父框架的NavigationService时(当你尝试使用它时它总是为null)。在类似的情况下,NavigationService以intellisence存在但始终为null。要启用站点范围的导航:

  1. 创建一个新的UserControl(我称之为“NavFrame”),里面有一个导航框架(我称之为“RootFrame”)。

  2. 在此框架内,您可以设置您喜欢的任何内容。

  3. 将此UserControl设置为App.xaml.cs中的RootVisual(即this.RootVisual = new NavFrame();)。

  4. 要在任何页面中使用NavigationService,您可以键入以下内容:

    ((NavFrame)App.Current.RootVisual).RootFrame.NavigationService
        .Navigate(new Uri("Your Uri", UriKind.RelativeOrAbsolute));
    

2 个答案:

答案 0 :(得分:1)

您可以创建一个Action并将其拖动到您想要进行导航的控件之上,就像这样:

public class NavigateAction : TriggerAction<DependencyObject>
{
    public Uri Uri
    {
        get;
        set;
    }

    protected override void Invoke(object parameter)
    {
        var frame = FindContainingFrame(AssociatedObject);

        if(frame == null)
            throw new InvalidOperationException("Could not find the containing Frame in the visual tree.");

        frame.Navigate(Uri);
    }

    protected static Frame FindContainingFrame(DependencyObject associatedObject)
    {
        var current = associatedObject;

        while(!(current is Frame))
        {
            current = VisualTreeHelper.GetParent(current);

            if(current == null)
                return null;
        }

        return (Frame)current;
    }
}

现在您只需拖动它并将其连接到目标页面即可。顺便说一句,SL4也是如此,从未在SL3上尝试过。并且URI的工作形式为:“ /SilverlightApplication1;component/Page1.xaml ”或框架上的UriMapping。

答案 1 :(得分:0)

((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame"))
    .Navigate(new Uri("Page Name", UriKind.Relative));