我创建了一个繁忙的框,其中包含一个不确定的进度条,该条在不同的线程上运行,以便在主要UI在繁重任务期间无响应时显示。现在的问题是,每当我显示忙碌的寡妇时,它会将开始菜单显示在前面,同时应用程序的主窗口以全屏运行,并在忙碌窗口关闭后立即恢复正常。
Start menu comes to front whenever i show the busy window
Application goes back to full screen once the busy window closes
我可以在代码中的任何地方使用后台工作人员轻松完成此操作,但我想要的是可重用的解决方案。谁能解释我为什么会这样?欢迎提出建议。
这是我对BusyBox的类定义
class BusyBox
{
static BusyBoxWindow BbwP;
static Thread WindowThread;
public static void ShowBusy()
{
if (WindowThread == null)
{
WindowThread = new System.Threading.Thread(() =>
{
SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
BbwP = new BusyBoxWindow();
/*BbwP.Owner = HomeWindow.HomeW;*/ // this line throws the exception "The calling thread cannot access this object because a different thread owns it"
BbwP.Show();
BbwP.Closed += (s, e) =>
{
Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
};
System.Windows.Threading.Dispatcher.Run();
});
WindowThread.SetApartmentState(ApartmentState.STA);
WindowThread.Start();
}
else
{
BbwP.Dispatcher.Invoke(new Action(() => { BbwP.Show(); }));
}
}
public static void CloseBusy()
{
BbwP.Dispatcher.Invoke(new Action(() => { BbwP.Hide(); }));
}
}
答案 0 :(得分:0)
我认为问题在于您需要在窗口之间建立父/子关系才能让它知道全屏窗口仍在顶部。但这意味着两个UI线程都需要抽取消息才能正常工作。这是行不通的,因为你说你正在阻止父母的UI线程。
解决方案(您似乎已经意识到)是不阻止UI线程并让它继续执行UI操作并将繁重的工作移到其他线程上 - 无论是后台工作者,{{1或者你认为合适的其他任何方式。
答案 1 :(得分:0)
在我将Busy窗口的ShowInTaskbar属性设置为false后,'任务栏'的奇怪行为消失了。谢谢大家对我的问题有所了解!