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);
}
}
我的项目页面太多,我想把这些页面的打开和关闭写在一个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 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:
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);
}
}