在 XAML 用户控件中,Frame 对象为空:
this.Frame.Navigate(typeof(FaxPropertiesPage));
如何使用 Windows 8 XAML 用户控件在页面之间导航?我已将控件放置在 XAML 页面上的 Callisto Flyout 中。
下面的搜索按钮必须将用户导航到另一个 XAML 页面。
在 XAML 用户控件中,Frame 对象为空:
this.Frame.Navigate(typeof(FaxPropertiesPage));
如何使用 Windows 8 XAML 用户控件在页面之间导航?我已将控件放置在 XAML 页面上的 Callisto Flyout 中。
下面的搜索按钮必须将用户导航到另一个 XAML 页面。
我已成功使用 app.xaml.cs 中的代码
Frame frame = Window.Current.Content as Frame;
然后使用标准的导航代码。
简单的代码(可能不是 100% 有效)是:
框架框架 = 新框架();frame.Navigate(typeof(ExerciseAddPage)
有好的方法和不太好的方法:
它们都从导航服务开始:
public interface INavigationService
{
bool CanGoBack { get; }
void GoBack();
void GoForward();
bool Navigate<T>(object parameter = null);
bool Navigate(Type source, object parameter = null);
void ClearHistory();
event EventHandler<NavigatingCancelEventArgs> Navigating;
}
public class NavigationService : INavigationService
{
private readonly Frame _frame;
public NavigationService(Frame frame)
{
_frame = frame;
frame.Navigating += FrameNavigating;
}
#region INavigationService Members
public void GoBack()
{
_frame.GoBack();
}
public void GoForward()
{
_frame.GoForward();
}
public bool Navigate<T>(object parameter = null)
{
Type type = typeof (T);
return Navigate(type, parameter);
}
那么,我在哪里获得框架?在 App.xaml.cs 中
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
// Do not repeat app initialization when already running, just ensure that
// the window is active
if (args.PreviousExecutionState == ApplicationExecutionState.Running)
{
Window.Current.Activate();
return;
}
// Create a Frame to act as the navigation context and navigate to the first page
var rootFrame = new Frame();
if (DesignMode.DesignModeEnabled)
SimpleIoc.Default.Register<INavigationService, DesignTimeNavigationService>();
else
SimpleIoc.Default.Register<INavigationService>(() => new NavigationService(rootFrame));
我在这里使用 MVVM Light。这让生活变得轻松,因为我所有的视图模型都是使用依赖注入创建的,并将它们的服务注入其中。
如果您不使用 MVVM Light 之类的东西并依赖代码隐藏,那么您仍然可以完成这项工作:只需将导航服务设为静态即可
public class NavigationService : INavigationService
{
public static INavigationService Current{
get;set;}
blah blah blah
}
并将 App.xaml.cs 更改为:
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
// Do not repeat app initialization when already running, just ensure that
// the window is active
if (args.PreviousExecutionState == ApplicationExecutionState.Running)
{
Window.Current.Activate();
return;
}
// Create a Frame to act as the navigation context and navigate to the first page
var rootFrame = new Frame();
NavigationService.Current= new NavigationService(rootFrame));
}
然后,您可以通过说:
NavigationService.Current.Navigate<MyView>();