Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Win10上具有多个窗口的uwp应用程序:如何将特定窗口置于前端_Uwp_Windows 10 Universal - Fatal编程技术网

Win10上具有多个窗口的uwp应用程序:如何将特定窗口置于前端

Win10上具有多个窗口的uwp应用程序:如何将特定窗口置于前端,uwp,windows-10-universal,Uwp,Windows 10 Universal,我尝试了Window.Activate(),但这并没有显示特定的窗口,只是显示了应用程序本身 我有多个应用程序正在管理的窗口,我希望能够根据需要打开一个特定的窗口。很抱歉,我将两个小时的时间延长了两天,但正如下面承诺的那样,这是您的解决方案。这可能不是实现这种功能的理想方式,但在我看来,这是一个完美的解决方案。我已经上传了一个解决方案以及一个驱动器 解决方案: 要在不重新启动新窗口的情况下实际处理多窗口切换,请执行以下操作: 按需打开特定窗口 您需要的是一个窗口日志记录服务。该服务将做的是,每

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


我有多个应用程序正在管理的窗口,我希望能够根据需要打开一个特定的窗口。

很抱歉,我将两个小时的时间延长了两天,但正如下面承诺的那样,这是您的解决方案。这可能不是实现这种功能的理想方式,但在我看来,这是一个完美的解决方案。我已经上传了一个解决方案以及一个驱动器


解决方案: 要在不重新启动新窗口的情况下实际处理多窗口切换,请执行以下操作:

按需打开特定窗口

您需要的是一个窗口日志记录服务。该服务将做的是,每次打开一个新窗口时,它都会将其与打开的窗口类型一起记录。我保存了一个整洁的
enum
来管理打开的窗口

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

窗口服务:
  • 创建
    windowLauncherService的单例实例
  • 维护
    WindowIDs
    TypeOfWindow
    的私有字典
  • 调用
    HandleWindowSwitch
    方法时,检查窗口是否已经启动(检查它是否存在于专用字典中),如果它确实调用wait
    ApplicationViewSwitcher.TryShowAsStandaloneAsync(Convert.ToInt32(existingViewID))。从字典的键中获取现有视图ID
  • 如果以前没有启动过该窗口,则只需启动该窗口,然后将其记录下来 就这样。下面是我的WindowsServiceCode:

    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
    }
    }
    
    请注意:所有视图中的所有按钮都具有相同的单击事件代码,它们都调用相同的单例实例


    请参阅我在一个驱动器上的源代码。如需任何帮助,请在评论部分告知我请注意我使用的是VS2017,如果您使用的是较旧的版本,那么几乎没有什么东西不可用,例如:
    out
    关键字in
    Enum.TryParse

    可能重复Nope,请仔细阅读问题。。。我知道如何打开新窗口。我想把这些窗户中的一扇带到前面。。。Activate看起来并没有这么做,只是将应用程序作为一个整体放在最前面,而不是我想打开的特定窗口……我有一个解决方案,而不是一个解决方案。我会试试,然后贴一个答案。给我两个小时。我现在不在,所以你正在使用ApplicationViewSwitcher。。。嗯,让我明天试试,我会告诉你的。很好的解决方案,顺便说一句。谢谢你,这是切换的唯一方法。除非有另一种方式,我猜是没有别的,人们会回答这个问题。一定要让我知道结果。onedrive上上载了一个示例解决方案well@J.H.has这个答案解决了这个问题吗?如果是,请您将我的答案标记为正确(或者,如果您喜欢该方法,请甚至向上投票),以便关闭该线程?我是最差的线程中的最差线程。非常抱歉。被完全排除在这个问题之外。应该能在月底前回到这个。。。啊现在的紧迫性;-)所以,终于有时间来测试这个。令人印象深刻的包装工作,但结果仍然是。。。没什么
    TryShowAsStandaloneAsync
    根本不会将子窗口带到前面。。。我确信实际的应用程序是拉上去的,但由于我与它进行了交互,它已经在前面了。。。我要找的是一种弹出儿童窗口的方法。。。
    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);
            }
        }