Silverlight NavigationService始终为空

Silverlight NavigationService始终为空,silverlight,xaml,navigation,Silverlight,Xaml,Navigation,我读到一些人对此有问题,所以我想发布一个(有点)优雅的解决方案,我在尝试处理这个问题时想出了这个解决方案。问题在于,当您在Silverlight中创建模板页面时,ContentControls没有父框架的NavigationService(当您尝试使用它时,它总是为null)。也有类似的场景,其中intellisence中存在导航服务,但始终为空。要启用站点范围的导航,请执行以下操作: 创建一个新的UserControl(我称之为我的“导航框架”),其中包含一个导航框架(我称之为我的“根框架”)

我读到一些人对此有问题,所以我想发布一个(有点)优雅的解决方案,我在尝试处理这个问题时想出了这个解决方案。问题在于,当您在Silverlight中创建模板页面时,ContentControls没有父框架的NavigationService(当您尝试使用它时,它总是为null)。也有类似的场景,其中intellisence中存在导航服务,但始终为空。要启用站点范围的导航,请执行以下操作:

  • 创建一个新的
    UserControl
    (我称之为我的“导航框架”),其中包含一个导航框架(我称之为我的“根框架”)

  • 在这个框架内,你可以设置任何你喜欢的内容

  • 在App.xaml.cs中将此用户控件设置为您的
    RootVisual
    (即
    this.RootVisual=new NavFrame();

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

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

  • 您可以创建一个动作并将其拖动到要进行导航的控件顶部,如下所示:

    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;
        }
    }
    
    公共类导航动作:触发动作
    {
    公共Uri
    {
    得到;
    设置
    }
    受保护的覆盖无效调用(对象参数)
    {
    var frame=FindContainingFrame(关联对象);
    if(frame==null)
    抛出新的InvalidOperationException(“在可视化树中找不到包含的帧”);
    框架导航(Uri);
    }
    受保护的静态帧FindContainingFrame(DependencyObject associatedObject)
    {
    var current=关联对象;
    而(!(当前为帧))
    {
    当前=VisualTreeHelper.GetParent(当前);
    如果(当前==null)
    返回null;
    }
    返回(帧)电流;
    }
    }
    

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

    +1:我一直在寻找一些东西,使我能够在App.xaml.cs类中使用NavigationService。谢谢
    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;
        }
    }