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