在Win10上有多个窗口的uwp应用程序:如何将特定窗口带到前面

时间:2017-07-13 05:31:56

标签: uwp windows-10-universal

我尝试了Window.Activate(),但这似乎没有显示特定的窗口,只是应用程序本身。

我有多个应用管理的窗口,我希望能够根据需要调出特定的窗口。

1 个答案:

答案 0 :(得分:0)

我很抱歉在2天内过了两个小时,但正如下面所承诺的那样是你的解决方案。它可能不是实现这种功能的理想方式,但在我看来,它是一种完美运行的解决方案。我已经将解决​​方案上传到一个驱动器。

解决方案:

要实际处理多个窗口切换而不重新启动新窗口,而不是单词:

  

按需提出特定窗口。

您需要的是窗口记录服务。这项服务的作用是,每次打开一个新窗口时,它都会将其与打开的窗口类型一起记录下来。我保持整洁Base来管理打开的窗户。

我会更多地谈论窗口日志记录服务而不是UI部分,因为UI只是调用服务的基本按钮。

窗口服务:

  1. 制作SomeOtherDerived
  2. 的单例实例
  3. 维护enumwindowLauncherService已启动的私人字典。
  4. 在调用WindowIDs方法时,检查窗口是否已经启动(检查它是否存在于私有词典中),如果它只是调用等待TypeOfWindow。从字典的键中获取existingViewID的位置。
  5. 如果之前尚未启动窗口,则只需启动窗口然后进行记录即可。
  6. 那就是它。下面是我的WindowServiceCode:

    HandleWindowSwitch

    点击按钮,这就是你要做的事情:

    ApplicationViewSwitcher.TryShowAsStandaloneAsync(Convert.ToInt32(existingViewID));

    请注意:所有视图中的所有按钮都具有相同的点击事件代码,并且它们都调用相同的单例实例。

    请参阅我的源代码来自一个驱动器。如有任何帮助,请在评论部分告诉我。 请注意我正在使用VS2017,如果您使用的是旧版本,则可能无法使用以下内容:例如namespace MultipleWindowTracker.Services { internal class WindowLauncherService { public static WindowLauncherService Instance { get; } = new WindowLauncherService(); private Dictionary<int, WindowType> WindowLogs { get; set; } internal async void HandleWindowSwitch(WindowType typeOfWindow) { if (WindowLogs?.ContainsValue(typeOfWindow) == true) { var existingViewID = WindowLogs?.FirstOrDefault(x => x.Value == typeOfWindow).Key; if (existingViewID != null) { await ApplicationViewSwitcher.TryShowAsStandaloneAsync(Convert.ToInt32(existingViewID)); } else { //Handle Error Here! } } else { await OpenNewWindow(typeOfWindow); } } /// <summary> /// Logs the new window. /// </summary> /// <param name="WindowID">The window identifier.</param> /// <param name="typeOfWindow">The type of window.</param> private void LogNewWindow(int WindowID, WindowType typeOfWindow) { if (WindowLogs?.ContainsKey(WindowID) == true) return; if (WindowLogs == null) WindowLogs = new Dictionary<int, WindowType>(); WindowLogs.Add(WindowID, typeOfWindow); } /// <summary> /// Opens the new window and if success logs it. /// </summary> /// <param name="typeOfWindow">The type of window.</param> /// <returns></returns> private async Task OpenNewWindow(WindowType typeOfWindow) { Type windowToLaunch = null; switch (typeOfWindow) { case WindowType.Main: windowToLaunch = typeof(MainPage); break; case WindowType.First: windowToLaunch = typeof(Scenarios.FirstWindow); break; case WindowType.Second: windowToLaunch = typeof(Scenarios.SecondWindow); break; case WindowType.Third: windowToLaunch = typeof(Scenarios.ThridWindow); break; default: return; } CoreApplicationView newView = CoreApplication.CreateNewView(); var currentFrame = Window.Current.Content as Frame; if (currentFrame.Content is MainPage) { var mainFrameID = ApplicationView.GetForCurrentView().Id; LogNewWindow(mainFrameID, WindowType.Main); } int newViewId = 0; await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Frame frame = new Frame(); frame.Navigate(windowToLaunch, null); Window.Current.Content = frame; // You have to activate the window in order to show it later. Window.Current.Activate(); newViewId = ApplicationView.GetForCurrentView().Id; }); bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId); if (viewShown) { LogNewWindow(newViewId, typeOfWindow); } else { //handle error on launch here! } } } public enum WindowType { Main, First, Second, Third } } 中的private void HandleWindowChange(object sender, RoutedEventArgs e) { var s = sender as Button; var conversionSuccessful = Enum.TryParse((string)s.Tag, true, out Services.WindowType TypeOfWindow); if (conversionSuccessful) { Services.WindowLauncherService.Instance.HandleWindowSwitch(TypeOfWindow); } } 关键字 The Link to the complete solution on github