WPF:即使显式设置 WindowState,窗口也会保持最小化

Posted

技术标签:

【中文标题】WPF:即使显式设置 WindowState,窗口也会保持最小化【英文标题】:WPF: Window stays minimized even when setting WindowState explicitly 【发布时间】:2011-01-24 09:31:52 【问题描述】:

我的应用程序有一个托盘图标,双击该图标会隐藏或显示应用程序窗口。我的问题是,如果窗口在隐藏时处于最小化状态,我似乎无法将其置于前台。

例如,假设用户最小化应用程序,然后双击托盘图标。然后应用程序窗口被隐藏并从任务栏中消失。当用户再次双击托盘图标时,应用程序窗口应该出现,即它应该从最小化状态恢复并被带到前台。

下面的代码应该做到这一点,但由于某种原因它没有:

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() 的调用表明状态确实设置为 Normal

【问题讨论】:

【参考方案1】:

我在 MSDN 论坛和 it got answered there 上交叉发布了我的问题。引用答案:


Window 上的一些属性更像方法,在某种意义上它们会导致复杂的动作发生,需要在前一个动作完成后发生。实现这一目标的一种方法是使用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()

【讨论】:

好的,这解决了问题,但你不觉得吗?我的意思是,你怎么知道什么时候可以使用房产?我觉得这很奇怪...... 也为我工作,谢谢。我发现我不得不将一个简单的属性更改包装到这个冗长的混乱中,这让我感到非常沮丧。我希望框架能够在内部处理这种复杂性。【参考方案2】:

我找到了更好的方法。当更改窗口的可见性和窗口状态时发生问题时,我所做的是更改属性 ShowInTaskBar 而不是可见性。无论如何,带有ShowInTaskBar = true 的最小化窗口就像一个隐藏窗口。

【讨论】:

【参考方案3】:

从用户的角度 单击最小化的图标 这应该显示应用程序的所有实例的列表。 右键单击此列表的成员 选择最大化。 请注意,右键单击最小化的图标将弹出一个带有关闭选项的菜单。 要获得最大化选项,您需要右键单击单击图标时出现的列表。

【讨论】:

以上是关于WPF:即使显式设置 WindowState,窗口也会保持最小化的主要内容,如果未能解决你的问题,请参考以下文章

wpf 如何启动一个窗口 是最大化的

C#创建wpf应用程序,如何不显示标题栏并使窗口全屏?

在WPF中我windowstate设置了初始最大化,结果运行的时候把任务栏盖住了,怎么让它不要盖住任务栏?

WPF中,做一个Button实现,窗口的最大化及其Normal(就像自带的那样)。如何实现?怎么判断当前是不是为窗口

WPF 杂记

WPF MVVM里,当用户在新窗口执行完后如何返回原窗口,并刷新