Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:即使显式设置WindowsState,窗口仍保持最小化_Wpf_Restore_Windowstate_Minimized - Fatal编程技术网

WPF:即使显式设置WindowsState,窗口仍保持最小化

WPF:即使显式设置WindowsState,窗口仍保持最小化,wpf,restore,windowstate,minimized,Wpf,Restore,Windowstate,Minimized,我的应用程序有一个托盘图标,双击该图标时,会隐藏或显示应用程序窗口。我的问题是,如果窗口被隐藏时处于最小化状态,我似乎无法将其置于前台 例如,假设用户最小化应用程序,然后双击托盘图标。应用程序窗口随即隐藏并从任务栏中消失。当用户再次双击托盘图标时,应用程序窗口应出现,即应将其从最小化状态恢复到前台 下面的代码应该做到这一点,但由于某些原因,它没有做到: private void TrayIcon_DoubleClick(object sender, EventArgs e) { if (

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

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

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

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

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


窗口上的某些属性更像方法,因为它们会导致复杂的操作发生,所以需要在上一个操作完成后发生。实现这一点的一种方法是使用
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()

我找到了一个更好的方法。当更改窗口的可见性和窗口状态时出现问题,我所做的是更改属性ShowInTaskBar而不是可见性。不管怎么说,一个最小化的窗口(ShowInTaskBar=true)就像一个隐藏的窗口。

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

好的,这解决了问题,但很糟糕,您不这么认为吗?我的意思是,你怎么知道什么时候可以使用一处房产?我觉得这很奇怪…对我也很有用,谢谢。我觉得很沮丧,我应该把一个简单的属性更改包装到这个冗长的混乱中。我希望框架能够在内部处理这种复杂性。