我有一个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应用程序在启动后显示焦点并激活。
为什么?
由于在文件上下文菜单(意味着Shell扩展)中明确单击子菜单后,它将由Windows(7,8.1和10)用户启动。这就是“为什么”我的客户想要出现在屏幕前面并集中注意力。
当?
实例化窗口后。
如何?
嗯,我做了一些研究,我找到了几种方法来做到这一点。我尝试过的方法之一是最小化窗口并恢复它。其他人喜欢使用SwitchToThisWindow或setforegroundwindow这两个函数,但我想知道是否有更好的选择。
当我尝试最小化并恢复窗口时会发生什么? (正确尺寸)
嗯,这种方式让我专注于主窗口,但它会改变宽度和高度。默认情况下,我在300(w)和300(h)上定义它们,但在将窗口状态更改为正常后,这些值将更改为400(w)和350(h)。
如果我什么都不做,那么它会立即成为焦点吗?
......不......
UPDATE2:
我选择下一个链接中使用的方法: https://www.roelvanlisdonk.nl/2014/09/05/reliable-bring-external-process-window-to-foreground-without-c/
答案 0 :(得分:0)
我不太确定你的问题是什么,但也许这会有所帮助。
1。)从StartupUri="MainWindow.xaml"
;
App.xaml
2。)添加Startup="Application_Startup"
您的App.xaml.cs
应如下所示:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
//Create new Instance of MainWindow
MainWindow mainWindow = new MainWindow();
//Set Properties of that Window
UpdateWindowPositionAndSize(mainWindow);
//Show it !
MainWindow = mainWindow; //This is the Application.MainWindow Property - not needed
mainWindow.ShowDialog();
}
private void UpdateWindowPositionAndSize(MainWindow mainWindow)
{
//Do your modifications here
mainWindow.Top = (SystemParameters.WorkArea.Height - mainWindow.Height) / 2;
mainWindow.Left = (SystemParameters.WorkArea.Width - mainWindow.Width) / 2;
}
}
所以基本上你只需要修改你的Window
,直到全部完成。
没有必要先显示它,改变它的位置然后重新打开它 - 如果我得到你的" usecase"右。
因为对我来说,看起来你正在隐藏窗户来做你的定位"。
但我认为在Initializing
时这样做会更好。
到目前为止,您的代码只是一个简短的评论:
ConfigureWindow()
仅执行minimize
。
其余的代码是无用的,因为当窗口被最小化时窗口会失去焦点。
这只会导致咳嗽。
如果您遇到WindowState = WindowState.Minimized;
问题,可以尝试Hide()
和Activate()
。
默认情况下,当调用Window.Show();
时,窗口将具有焦点。点击此处查看details。
设置WindowState = WindowState.Minimized;
后,您不需要再次拨打base.Show();
- 窗口已经显示。 WindowState = WindowState.Normal;
应该完成这项工作。