当应用程序启动时从隐藏状态显示时,C# WPF 窗口未位于中心

标签 c# wpf xaml window

我构建了一个 C# WPF 应用程序,其中:

  • 它有一个系统托盘图标。
  • 它可以接受命令行参数--minimize-to-tray,使窗口在应用程序启动时从任务栏隐藏,要打开它,我们必须双击系统托盘图标或右键单击该图标并选择“打开”。
  • 应用启动时,窗口位置应位于屏幕中央。

我的窗口只有一个,即 MainWindow,我在其 XAML 上设置了

WindowStartupLocation="CenterScreen"

使窗口位于屏幕中央。

一切都很棒。在没有参数的正常情况下,应用程序居中。

...但是,不适用于这个:当我使用参数 --minimize-to-tray 运行应用程序并双击系统托盘图标以显示窗口时,它不是居中。


这是我接受参数及其相关操作的代码:

...

/// <summary>
/// MainWindow constructor
/// <summary>
public MainWindow()
{
    InitializeComponent();

    InitializeAppArguments();

    ...
}

/// <summary>
/// Initialize actions that are associated with application's arguments.
/// </summary>
public void InitializeAppArguments()
{
    string[] args = Environment.GetCommandLineArgs();

    // Minimize window on app startup to tray 
    // if user put first argument "--minimize-to-tray" on the app
    //
    if (args.Length >= 2)
    {
        if (args[1] == "--minimize-to-tray")
        {
            this.WindowState = WindowState.Minimized;
            this.Hide();

            this.StateChanged += MainWindow_StateChanged;
        }
    }
}

...

/// <summary>
/// Hide app's window from taskbar whenever user minimize the app window.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void MainWindow_StateChanged(object sender, EventArgs e)
{
    // When app's window is minimized, hide it from taskbar
    //
    if (this.WindowState == WindowState.Minimized)
    {
        this.Hide();
    }
}


双击系统托盘图标或单击图标的“打开”上下文菜单上的事件处理程序:

/// <summary>
/// Open/show application when user click on "Open" context menu on application's system tray icon.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void MenuOpen_Click__SysTrayIcon_DoubleClick(object sender, EventArgs e)
{
    this.Show();
    this.Focus();

    this.WindowState = WindowState.Normal;
}


那么,为什么在应用程序启动时隐藏显示窗口时窗口不居中呢?我在这里做错了什么吗?

如有任何帮助,我们将不胜感激。

最佳答案

根据这个solution :

It is necessary to set WindowState to Normal before setting window location.


显然,它还可以防止窗口出现不居中的情况。我的错误是,在隐藏窗口之前,我将 WindowState 设置为“最小化”,这使得窗口不居中。

因此,为了解决这个问题,我将行 this.WindowState = WindowState.Minimized; 更改为 this.WindowState = WindowState.Normal;

public void InitializeAppArguments()
{
    string[] args = Environment.GetCommandLineArgs();

    // Minimize window on app startup to tray 
    // if user put first argument "--minimize-to-tray" on the app
    //
    if (args.Length >= 2)
    {
        if (args[1] == "--minimize-to-tray")
        {
            this.WindowState = WindowState.Normal; // Fixed the problem
            this.Hide();

            this.StateChanged += MainWindow_StateChanged;
        }
    }
}

关于当应用程序启动时从隐藏状态显示时,C# WPF 窗口未位于中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41842674/

相关文章:

c# - 绑定(bind)命令丢失

c# - 如何在不单击窗体的情况下触发窗体上的默认按钮(winforms)?

c# - LINQ QueryProvider 选择

c# - 更新数据库源后,如何让 Visual Studio 2010 刷新我的数据集?

c# - 在 WPF 的代码隐藏中为 ListBox 创建 ItemTemplate - 第 II 部分

c# - 安装项目正在添加内置 .NET Framework .System 程序集以输出

c# - 如何使 UiPath 自定义事件看起来不错?

c# - 如何让标签文字自动滚动?

c# - 为 Windows Store App 定制的虚拟键盘

xaml - 针对 Xaml 中的 Picker.Items 获取整数值