我的应用程序有一个托盘图标,双击该图标可隐藏或显示应用程序窗口。我的问题是,如果窗口在隐藏时处于最小化状态,则似乎无法将其置于前景。
例如,假设用户将应用程序最小化,然后双击任务栏图标。然后,应用程序窗口被隐藏,并从任务栏中消失。当用户再次双击托盘图标时,应显示应用程序窗口,即应从最小化状态还原并带到前台。
下面的代码应该这样做,但是由于某些原因,它不能这样做:
private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
if (this.Visibility == Visibility.Hidden)
{
this.Visibility = Visibility.Visible;
this.WindowState = WindowState.Normal;
this.Activate();
}
...
}
该应用程序保持最小化,并且不会被带到前台。 Activate()返回true,随后对的调用TrayIcon_DoubleClick()表示状态确实设置为正常。
最佳答案
我交叉在MSDN论坛和it got answered there上发布了我的问题。引用答案:
从某种意义上说,Window上的某些属性更像方法,从某种意义上讲,它们会导致发生复杂的 Action ,需要在上一个 Action 完成后才发生。实现该目标的一种方法是使用Dispatcher.BeginInvoke
。如果您将代码更改为如下所示,则它应该可以工作:
if (this.Visibility == Visibility.Hidden)
{
this.Visibility = Visibility.Visible;
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(delegate()
{
this.WindowState = WindowState.Normal;
this.Activate();
})
);
}
我尝试了一下,它为我解决了问题。另外,我认为您也可以省略
this.Activate()
。
关于WPF:即使显式设置WindowState,窗口也会保持最小化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2391589/