【问题标题】:WPF UI resize after minimize and restore最小化和还原后 WPF UI 调整大小
【发布时间】: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 不是你的主要表单类吗?详细说明具体需求是什么,为什么,何时,如何……因为至少对我来说这还不清楚。问题是什么? ...当表单打开时它没有焦点? ....
  • 请定义在这种情况下正确的尺寸是什么
  • 是的,当表单打开时,它没有焦点......(我已经更新了帖子,感谢您的建议)

标签: c# wpf xaml


【解决方案1】:

我不太确定您的问题是什么,但也许这会有所帮助。

1.) 从App.xaml 中删除StartupUri="MainWindow.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 直到 all 完成。 没有必要先展示它,改变它的位置然后重新打开它——如果我的“用例”正确的话。

因为在我看来,您似乎在隐藏窗口以进行“定位”。 不过我觉得Initializing的时候最好这样做。


到目前为止,只是对您的代码的简短评论:

ConfigureWindow() 只是在做minimize。 您的其余代码毫无用处,因为显然窗口在最小化时会失去焦点。

我建议不要使用已经存在的名称创建方法。

这只会导致混乱。

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

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

同样在设置WindowState = WindowState.Minimized; 之后,您不需要再次调用base.Show(); - 窗口已经显示。 WindowState = WindowState.Normal; 应该可以完成这项工作。

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多