UWP 在 Class 中打开新的 Window

UWP Open New Window in Class

我的项目页面太多,我想把这些页面的打开和关闭写在一个class。但是打不开新页面

谢谢。

我的Class代码

class Class
{
    public static void GoToOpenPage1()
    {
        Frame OpenPage1 = new Frame();
        OpenPage1.Navigate(typeof(MainPage));
    }
}

按钮点击代码

private void button_Click(object sender, RoutedEventArgs e)
    {
        Class.GoToOpenPage1();
    }

创建Frame后,需要将其插入到当前可视化树中才能“看到”。

比如我们在MainPage.xaml.

中创建一个Grid
<Grid x:Name="FrameContainer"  x:FieldModifier="public">

</Grid>

MainPage.xaml.cs中,我们可以通过静态变量暴露MainPage实例

public static MainPage Current;
public MainPage()
{
    this.InitializeComponent();
    Current = this;
}

这样,加载MainPage的时候,也会加载FrameContainer。我们可以通过MainPage.Current.FrameContainer从外部获取到这个Grid,然后将我们生成的Frame插入到这个Grid中,这样就完成了插入可视化树的步骤。

public static void GoToOpenPage1()
{
    Frame OpenPage1 = new Frame();
    OpenPage1.Navigate(typeof(OtherPage));
    MainPage.Current.FrameContainer.Children.Clear();
    MainPage.Current.FrameContainer.Children.Add(OpenPage1);
}

但是从您提供的代码来看,您似乎正在导航到 MainPage。如果需要让MainPage再次成为Window的内容,可以这样写:

var rootFrame = Window.Current.Content as Frame;
rootFrame.Navigate(typeof(MainPage));

以上内容属于页面导航,如果要新开window,可以参考这个文档,里面有详细的说明:

如果您的目标是 Windows 10 版本 1903 (SDK 18362) 或更高版本,您可以使用 AppWindow API:

打开 window
class Class
{
    public static async Task GoToOpenPage1()
    {
        AppWindow appWindow = await AppWindow.TryCreateAsync();
        Frame OpenPage1 = new Frame();
        OpenPage1.Navigate(typeof(MainPage));
        ElementCompositionPreview.SetAppWindowContent(appWindow, OpenPage1);
        await appWindow.TryShowAsync();
    }
}

在早期版本中,您应该创建一个 CoreApplicationView:

class Class
{
    public static async Task GoToOpenPage1()
    {
        CoreApplicationView newView = CoreApplication.CreateNewView();
        int newViewId = 0;
        await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            Frame OpenPage1 = new Frame();
            OpenPage1.Navigate(typeof(MainPage));
            Window.Current.Content = OpenPage1;
            Window.Current.Activate();
            newViewId = ApplicationView.GetForCurrentView().Id;
        });
        bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    }
}