UWP 无法识别 StartupUri

StartupUri not recognized in UWP

我在 UWP 中有这样一个主页:

public sealed partial class MainPage : Page
{
    private MainViewModel _viewModel;

    public MainPage()
    {
        this.InitializeComponent();
        _viewModel = new MainViewModel(new MyDataService());
        DataContext = _viewModel;
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        _viewModel.Load();
    }
}

我的 window 应用程序启动并且 运行 没有问题。

现在,我想将 MainViewModel 作为参数传递给 MainPage。

public sealed partial class MainPage : Page
{
    private MainViewModel _viewModel;

    public MainPage(MainViewWindow mvw)
    {
        this.InitializeComponent();
        _viewModel = mvw;
        DataContext = _viewModel;
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        _viewModel.Load();
    }
}

如何初始化并将参数传递给MainPage?通用 Windows 似乎无法像 WPF 那样识别 App.xaml 中的 StartupUri

在 UWP 中,Page 需要有一个无参数的构造函数。这样做的原因是 Frame.Navigate 方法仅将页面的 Type 作为参数,并处理其实例化。这很不幸,我们计划在未来的 WinUI 版本中对此进行改进(这甚至是 Prism 不得不在较新版本中放弃对 UWP 支持的原因之一)。

目前,您需要保持构造函数无参数并在构造函数完成后注入服务。

如果只需要传递简单的参数,可以使用Frame.Navigate(Type, object)方法。第二个参数是您的参数,您可以在重写 Page.OnNavigatedTo 方法时检索该参数。请注意,参数类型只能是简单类型(stringint 等),因为它需要在应用程序启动时在 Frame 的导航堆栈中自动序列化暂停。如有必要,您可以使用 JSON 字符串转换更复杂的参数。

许多 MVVM 框架可以为您完成大部分繁重的工作 - 例如 MvvmCross。这是一个非常好的设置,带有内置的 IoC 提供程序,可以为您完成很多工作,包括管理视图模型生命周期以及通过命名约定匹配视图和视图模型。