当应用程序的主视图关闭但辅助视图仍处于打​​开状态并从开始菜单打开应用程序时,如何恢复UWP应用程序的主视图?

时间:2018-10-08 09:28:37

标签: c# uwp windows-10-universal

我正在开发具有多个视图的UWP应用。 (假设我在单独的窗口中打开应用的设置。)在以下情况下,我需要恢复应用的主视图。

  1. 打开应用。
  2. 在辅助视图中打开应用程序设置。
  3. 关闭应用程序的主视图,并保持打开设置窗口。
  4. 从开始菜单或通过单击应用程序的快捷方式图标打开应用程序。

以上操作将我带到已打开的辅助视图(“设置”窗口)。但是我需要调出应用程序的主视图。

在我的App.xaml.cs文件的OnLaunched方法中,CoreApplication.GetCurrentView().IsMain给了我true,但是CoreApplication.GetCurrentView().IsHosted给了我false。我尝试了CoreApplication.GetCurrentView().CoreWindow.Activate()Window.Current.Activate();,但都无济于事,它只带我进入保持打开状态的辅助视图(设置窗口)。

如何调出UWP应用的主视图?

2 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法。我的要求是,当应用程序的主窗口已关闭但辅助窗口仍处于打开状态,并且用户尝试从开始菜单或通过单击应用程序的图标打开应用程序时,我应调出应用程序的主视图在单独的窗口中,而不关闭用户当前所在的辅助视图/窗口。换句话说,只需将应用程序的主窗口置于前面,然后将辅助窗口放在该主窗口的后面即可。所以现在我们将在屏幕上有2个窗口:

1。主窗口

2。已打开辅助窗口。

我是通过以下代码实现的。

// MainActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView.adapter = ImageListAdapter() recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false) } } // ImageListAdapter class ImageListAdapter(): RecyclerView.Adapter<VH>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { val view = LayoutInflater.from(parent.context).inflate(R.layout.image, parent, false) return VH(view) } override fun getItemCount(): Int { return 100 } override fun onBindViewHolder(holder: VH, position: Int) { Picasso.get() .load("https://picsum.photos/${100 + position}") .into(holder.image) } } class VH(val view: View): RecyclerView.ViewHolder(view){ val image: ImageView init{ image = view.findViewById(R.id.image) } } 文件的App.xaml.cs方法中,参数OnLaunched(LaunchActivatedEventArgs e)具有名为LaunchActivatedEventArgs e的属性,该属性提供视图的ID,用户当前所在的位置为( (如果打开了任何应用程序视图)。

CurrentlyShownApplicationViewId给出应用主视图的ID。

有了这两个ID,我便可以在以下代码的帮助下打开应用程序的主窗口。

ApplicationView.GetApplicationViewIdForWindow(CoreApplication.GetCurrentView().CoreWindow)

Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await ApplicationViewSwitcher.TryShowAsStandaloneAsync( ApplicationView.GetApplicationViewIdForWindow( CoreApplication.GetCurrentView().CoreWindow), ViewSizePreference.Default, e.CurrentlyShownApplicationViewId, ViewSizePreference.Default); }); 将我应用程序的主窗口带回到前面的一个单独的窗口中,而使第二个窗口的后面不受干扰。因此,现在用户有2个窗口-应用程序的主窗口以及现有的辅助窗口。

答案 1 :(得分:1)

根据您的要求,您可以参考MultipleViews官方代码示例。并且可以切换到主视图操作。如果主视图关闭,则可以使用它切换到主视图事件。

enter image description here

private async void GoToMain_Click(object sender, RoutedEventArgs e)
{
    // Switch to the main view without explicitly requesting
    // that this view be hidden
    thisViewControl.StartViewInUse();
    await ApplicationViewSwitcher.SwitchAsync(mainViewId);
    thisViewControl.StopViewInUse();
}