c#:窗口转到第二个监视器,然后跳回主监视器

c#:窗口转到第二个监视器,然后跳回主监视器,c#,wpf,windows,multiple-monitors,C#,Wpf,Windows,Multiple Monitors,下面是简化的代码,奇怪的是,窗口在一瞬间停留在第二个监视器上,然后又回到第一个主监视器。必须有一个窗口设置或外部程序导致它。因为相同的代码在另一台双屏计算机上工作。我确信并再次检查了第二个监视器是否在索引1中:shownMonitor(1,Q) 好吧,我不知道为什么会这样。但这是解决办法 Q = new queue(); Q.Show(); Thread.Sleep( 100 ); //need to delay first before moving the position showOnMo

下面是简化的代码,奇怪的是,窗口在一瞬间停留在第二个监视器上,然后又回到第一个主监视器。必须有一个窗口设置或外部程序导致它。因为相同的代码在另一台双屏计算机上工作。我确信并再次检查了第二个监视器是否在索引1中:shownMonitor(1,Q)


好吧,我不知道为什么会这样。但这是解决办法

Q = new queue();
Q.Show();
Thread.Sleep( 100 ); //need to delay first before moving the position
showOnMonitor(1, Q);

public static void showOnMonitor(int monitor, Window w2)
        {
            Screen[] sc;
            sc = Screen.AllScreens;

            if ( monitor >= sc.Length )
            {
                monitor = 0;
            }


            w2.WindowStartupLocation = WindowStartupLocation.Manual;

            var workingArea = sc[monitor].WorkingArea;
            w2.Left = workingArea.Left;
            w2.Top = workingArea.Top;
            w2.Width = workingArea.Width;
            w2.Height = workingArea.Height;

        }

在调试中破坏showOnMonitor可以告诉您原因。。你试过打破它吗?好主意,我会试试。@tagaPdyk这很奇怪,使用调试模式一步一步地,窗口会转到第二个监视器,甚至在执行结束之前都不会跳回到第一个监视器。@tagaPdyk好的,现在我发现窗口实际上跟随我的光标,如果我的光标放在第二个监视器上,那么只有它会显示在那里。为什么?我不知道这是否相关,但是看到在代码中您接收到窗口作为参数,我告诉它。我注意到,必须在构造函数中设置WindowsStartUplocation的默认设置才能正常工作,因此WindowsStartUplocation.Manual可能应该由创建窗口的代码设置(或者在窗口类代码中设置,如果有的话)。
Q = new queue();
Q.Show();
Thread.Sleep( 100 ); //need to delay first before moving the position
showOnMonitor(1, Q);

public static void showOnMonitor(int monitor, Window w2)
        {
            Screen[] sc;
            sc = Screen.AllScreens;

            if ( monitor >= sc.Length )
            {
                monitor = 0;
            }


            w2.WindowStartupLocation = WindowStartupLocation.Manual;

            var workingArea = sc[monitor].WorkingArea;
            w2.Left = workingArea.Left;
            w2.Top = workingArea.Top;
            w2.Width = workingArea.Width;
            w2.Height = workingArea.Height;

        }