我读到有些人遇到了这个问题所以我想发布一个(有点)优雅的解决方案,我试图解决这个问题。问题是当你在Silverlight中创建模板化页面而ContentControls没有父框架的NavigationService时(当你尝试使用它时它总是为null)。在类似的情况下,NavigationService以intellisence存在但始终为null。要启用站点范围的导航:
创建一个新的UserControl
(我称之为“NavFrame”),里面有一个导航框架(我称之为“RootFrame”)。
在此框架内,您可以设置您喜欢的任何内容。
将此UserControl设置为App.xaml.cs中的RootVisual
(即this.RootVisual = new NavFrame();
)。
要在任何页面中使用NavigationService,您可以键入以下内容:
((NavFrame)App.Current.RootVisual).RootFrame.NavigationService
.Navigate(new Uri("Your Uri", UriKind.RelativeOrAbsolute));
答案 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));