Win10上具有多个窗口的uwp应用程序:如何将特定窗口置于前端
我尝试了Window.Activate(),但这并没有显示特定的窗口,只是显示了应用程序本身Win10上具有多个窗口的uwp应用程序:如何将特定窗口置于前端,uwp,windows-10-universal,Uwp,Windows 10 Universal,我尝试了Window.Activate(),但这并没有显示特定的窗口,只是显示了应用程序本身 我有多个应用程序正在管理的窗口,我希望能够根据需要打开一个特定的窗口。很抱歉,我将两个小时的时间延长了两天,但正如下面承诺的那样,这是您的解决方案。这可能不是实现这种功能的理想方式,但在我看来,这是一个完美的解决方案。我已经上传了一个解决方案以及一个驱动器 解决方案: 要在不重新启动新窗口的情况下实际处理多窗口切换,请执行以下操作: 按需打开特定窗口 您需要的是一个窗口日志记录服务。该服务将做的是,每
我有多个应用程序正在管理的窗口,我希望能够根据需要打开一个特定的窗口。很抱歉,我将两个小时的时间延长了两天,但正如下面承诺的那样,这是您的解决方案。这可能不是实现这种功能的理想方式,但在我看来,这是一个完美的解决方案。我已经上传了一个解决方案以及一个驱动器
解决方案: 要在不重新启动新窗口的情况下实际处理多窗口切换,请执行以下操作: 按需打开特定窗口 您需要的是一个窗口日志记录服务。该服务将做的是,每次打开一个新窗口时,它都会将其与打开的窗口类型一起记录。我保存了一个整洁的
enum
来管理打开的窗口
我将更多地讨论窗口日志服务,而不是UI部分,因为UI只是调用服务的基本按钮
窗口服务:
windowLauncherService的单例实例
WindowIDs
和TypeOfWindow
的私有字典HandleWindowSwitch
方法时,检查窗口是否已经启动(检查它是否存在于专用字典中),如果它确实调用waitApplicationViewSwitcher.TryShowAsStandaloneAsync(Convert.ToInt32(existingViewID))代码>。从字典的键中获取现有视图ID
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
关键字inEnum.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);
}
}