WPF:切换主屏幕时保持 window 最大化
WPF : Keep the window maximized when switch main screen
我想保持 window 始终最大化,它在单个屏幕中完美运行。但是当我使用两个屏幕时(尤其是当主屏幕改变时),我捕捉到分辨率改变事件并使其最大化,但它不起作用。而且我也尝试过处理window的宽高,也没用
我是这样操作的:
- 使用单小屏(1366 * 768),window最大化
- 再接一个大屏(1920 * 1080),设置为主屏(我们现在有两个屏)。然后window会显示在大屏上,不是最大化并保持 1366*768 的大小(奇怪的是它有时会最大化,但并非总是如此)。
这是我的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.WindowState = WindowState.Maximized;
SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;
}
//this method catch the resolution changed event
private void SystemEvent_DisplaySettingsChanged(object sender, EventsArgs e)
{
WindowState = WindowState.Maximized;
}
}
windowxaml代码:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ResizeMode="CanMinimize"
SizeToContent="Manual"
WindowStartupLocation="CenterScreen" />
您提到它有时有效,但并非总是有效。也许您不应该立即对设置更改做出反应,而应该将您的响应与调度程序一起排队,以便它在事情稳定下来后运行。
在您的 SystemEvent_DisplaySettingsChanged
方法中,尝试将代码更改为:
WindowState = WindowState.Normal;
Dispatcher.BeginInvoke(new Action(() => WindowState = WindowState.Maximized), DispatcherPriority.Background);
我没有尝试重现你的问题,所以我不能确定这是否有效。不过似乎值得一试。
编辑:首先将 window 状态设置为正常,以防它认为它已经最大化。
我想保持 window 始终最大化,它在单个屏幕中完美运行。但是当我使用两个屏幕时(尤其是当主屏幕改变时),我捕捉到分辨率改变事件并使其最大化,但它不起作用。而且我也尝试过处理window的宽高,也没用
我是这样操作的:
- 使用单小屏(1366 * 768),window最大化
- 再接一个大屏(1920 * 1080),设置为主屏(我们现在有两个屏)。然后window会显示在大屏上,不是最大化并保持 1366*768 的大小(奇怪的是它有时会最大化,但并非总是如此)。
这是我的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.WindowState = WindowState.Maximized;
SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;
}
//this method catch the resolution changed event
private void SystemEvent_DisplaySettingsChanged(object sender, EventsArgs e)
{
WindowState = WindowState.Maximized;
}
}
windowxaml代码:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ResizeMode="CanMinimize"
SizeToContent="Manual"
WindowStartupLocation="CenterScreen" />
您提到它有时有效,但并非总是有效。也许您不应该立即对设置更改做出反应,而应该将您的响应与调度程序一起排队,以便它在事情稳定下来后运行。
在您的 SystemEvent_DisplaySettingsChanged
方法中,尝试将代码更改为:
WindowState = WindowState.Normal;
Dispatcher.BeginInvoke(new Action(() => WindowState = WindowState.Maximized), DispatcherPriority.Background);
我没有尝试重现你的问题,所以我不能确定这是否有效。不过似乎值得一试。
编辑:首先将 window 状态设置为正常,以防它认为它已经最大化。