我尝试了Window.Activate(),但这似乎没有显示特定的窗口,只是应用程序本身。
我有多个应用管理的窗口,我希望能够根据需要调出特定的窗口。
答案 0 :(得分:0)
我很抱歉在2天内过了两个小时,但正如下面所承诺的那样是你的解决方案。它可能不是实现这种功能的理想方式,但在我看来,它是一种完美运行的解决方案。我已经将解决方案上传到一个驱动器。
要实际处理多个窗口切换而不重新启动新窗口,而不是单词:
按需提出特定窗口。
您需要的是窗口记录服务。这项服务的作用是,每次打开一个新窗口时,它都会将其与打开的窗口类型一起记录下来。我保持整洁Base
来管理打开的窗户。
我会更多地谈论窗口日志记录服务而不是UI部分,因为UI只是调用服务的基本按钮。
SomeOtherDerived
enum
和windowLauncherService
已启动的私人字典。WindowIDs
方法时,检查窗口是否已经启动(检查它是否存在于私有词典中),如果它只是调用等待TypeOfWindow
。从字典的键中获取existingViewID的位置。那就是它。下面是我的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