最小化和恢复后,WPF UI会调整大小

时间:2016-11-18 19:52:40

标签: c# wpf xaml

我有一个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/

1 个答案:

答案 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。 其余的代码是无用的,因为当窗口被最小化时窗口会失去焦点。

我建议不要创建名称已经存在的方法。 enter image description here

这只会导致咳嗽。

如果您遇到WindowState = WindowState.Minimized;问题,可以尝试Hide()Activate()

默认情况下,当调用Window.Show();时,窗口将具有焦点。点击此处查看details

设置WindowState = WindowState.Minimized;后,您不需要再次拨打base.Show(); - 窗口已经显示。 WindowState = WindowState.Normal;应该完成这项工作。