【发布时间】:2016-11-18 19:52:39
【问题描述】:
我有一个 WPF 应用程序。我需要在实例化后最小化并恢复主窗口以获得焦点。我正在使用类似以下类的东西,但它没有做出我想要的,因为当窗口恢复时,它的大小无效。我试图修改宽度和高度,但它不起作用。
public class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ConfigureWindow();
}
public void Show()
{
base.Show();
UpdateWindowPositionAndSize();
base.WindowState = WindowState.Normal;
base.Show();
}
private void ConfigureWindow()
{
base.ShowActivated = true;
this.Focusable = true;
if (base.IsActive == false)
{
base.Activate();
}
if (base.IsFocused == false)
{
base.Focus();
}
base.WindowState = WindowState.Minimized;
}
private void UpdateWindowPositionAndSize()
{
this.Top = (SystemParameters.WorkArea.Height - this.Height) / 2;
this.Left = (SystemParameters.WorkArea.Width - this.Width) / 2;
}
}
我做错了什么?还有另一种获得焦点的方法吗?对不起,如果这个问题太新了。
更新:
具体需求是什么?
我需要我的 WPF 应用程序在启动后显示为焦点并处于活动状态。
为什么?
因为它将由 Windows(7、8.1 和 10)用户在明确单击文件上下文菜单中的子菜单(即 Shell 扩展)后启动。这就是我的客户希望它出现在屏幕前面并集中注意力的“原因”。
什么时候?
实例化窗口后。
怎么做?
嗯,我做了一些研究,并找到了几种方法来做到这一点。我尝试过的一种方法是最小化窗口并恢复它。其他人喜欢使用 SwitchToThisWindow 或 setforegroundwindow 函数,但我想知道是否有更好的选择。
当我尝试最小化和恢复窗口时会发生什么? (正确大小)
嗯,这种方式让我专注于主窗口,但它改变了宽度和高度。默认情况下,我在 300 (w) 和 300 (h) 上定义它们,但是在将窗口状态更改为正常后,这些值会更改为 400 (w) 和 350 (h)。
如果我什么都不做,它马上就有焦点了?
...没有...
更新 2:
我选择下一个链接中使用的方法: https://www.roelvanlisdonk.nl/2014/09/05/reliable-bring-external-process-window-to-foreground-without-c/
【问题讨论】:
-
“我需要在实例化后最小化并恢复主窗口以获得焦点” ...为什么?
-
我知道它很脏 :c,但是我的客户希望在启动应用后获得焦点,如果有更优雅的方式请告诉我
-
MainWindow不是你的主要表单类吗?详细说明具体需求是什么,为什么,何时,如何……因为至少对我来说这还不清楚。问题是什么? ...当表单打开时它没有焦点? .... -
请定义在这种情况下正确的尺寸是什么
-
是的,当表单打开时,它没有焦点......(我已经更新了帖子,感谢您的建议)