WPF双屏窗口第二次显示时位置异常问题
WPF双显示器窗口第二次显示位置异常问题
环境与配置
- 显示器参数:
- 显示器1:分辨率5120x1440,工作区矩形:
Left=0, Top=0, Width=5120, Height=1392 - 显示器2:分辨率2560x1440,开启125%缩放且存在显示偏移,工作区矩形:
Left=5120, Top=353, Width=2048, Height=1104
- 显示器1:分辨率5120x1440,工作区矩形:
- 实现逻辑:通过
Screen.AllScreens[0].WorkingArea和Screen.AllScreens[1].WorkingArea获取对应显示器工作区,分别显示两个独立窗口
问题现象
- 首次调用显示逻辑时,两个窗口分别在对应显示器上正常布局
- 第二次调用显示逻辑时,代码中已为Window 2设置正确位置,但实际显示在
(0,0)位置,与Window 1重叠 - 后续再次调用显示逻辑时,Window 2位置恢复正常
已尝试方案
调整窗口属性、添加显示延迟、修改显示器缩放/偏移设置、在Show()后重设窗口位置,均未解决问题
测试代码
MainWindow.xaml(MainWindow.xaml.cs无修改)
<Window x:Class="TestApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TestApp" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" WindowStartupLocation="Manual" ShowInTaskbar="False" ResizeMode="NoResize"> <Grid> <Label Content="ABCD" Foreground="Red" FontSize="36" /> </Grid> </Window>
App.xaml(移除StartupUri)
<Application x:Class="TestApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TestApp"> <Application.Resources> </Application.Resources> </Application>
后台代码
using Gma.System.MouseKeyHook; using System.Diagnostics; using System.Windows; using System.Windows.Forms; namespace TestApp { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : System.Windows.Application { MainWindow window1 = new MainWindow(); MainWindow window2 = new MainWindow(); private IKeyboardMouseEvents keyboardMouseEvents = Hook.GlobalEvents(); protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); keyboardMouseEvents.KeyUp += KeyboardMouseEvents_KeyUp; window1.Title = "WINDOW 1"; window2.Title = "WINDOW 2"; } private void KeyboardMouseEvents_KeyUp(object? sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == System.Windows.Forms.Keys.LControlKey) { Toggle(); } } private void Show() { window1.Left = Screen.AllScreens[0].WorkingArea.Left; window1.Top = Screen.AllScreens[0].WorkingArea.Top; window1.Width = Screen.AllScreens[0].WorkingArea.Width; window1.Height = Screen.AllScreens[0].WorkingArea.Height; window1.Show(); window2.Left = Screen.AllScreens[1].WorkingArea.Left; window2.Top = Screen.AllScreens[1].WorkingArea.Top; window2.Width = Screen.AllScreens[1].WorkingArea.Width; window2.Height = Screen.AllScreens[1].WorkingArea.Height; Debug.WriteLine($"Left {window2.Left} Top {window2.Top} Width {window2.Width} Height {window2.Height}"); window2.Show(); } private void Toggle() { if (window1.IsVisible) { window1.Hide(); window2.Hide(); } else { Show(); } } } }
内容的提问来源于stack exchange,提问作者esac
相关产品推荐
相关产品推荐

