双监视器父/子窗口问题

本文关键字:窗口 问题 监视器 | 更新日期: 2023-09-27 18:05:21

我有两台显示器。当我的应用程序运行时,父程序显示在第一个监视器上。当我将父窗口移动到第二个监视器并单击按钮(显示用于加载的xaml窗口)时,该子窗口将停留在第一个监视器上。是否有一种方法可以使子窗口与父窗口保持在一起,无论父窗口位于何处?

请注意:parent是winform…

loading

<Window x:Class="Test.Loading"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    WindowStyle="None" 
    AllowsTransparency="True" 
    WindowState="Maximized"
    Background="Gray">
    <Grid>
        <Border>
            <TextBlock Text="Loading ..." />
        </Border>
    </Grid>
</Window>
父母

    private void btnShowLoading_Click(object sender, EventArgs e)
{
    Loading load = new Loading();
    double top = this.Top;
    double left = this.Left;
    load.Top = top;
    load.Left = left;
    load.Show();
}

双监视器父/子窗口问题

试试这个:

childWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;

更新1:

获取父窗口的位置并将其设置为子窗口。如果你认为父窗口的状态改变了,你可以使用这个来获取实际的Top and Left:

var leftField = typeof(Window).GetField("_actualLeft", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var topField = typeof(Window).GetField("_actualTop", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
double left = (double)leftField.GetValue(parentWindow);
double top = (double)topField.GetValue(parentWindow);

来源:Window ActualTop, ActualLeft

更新2:首先你要知道parentWindowWinForms。在这种情况下,您可以像这样获得parentwwindow的TopLeft:

double top = this.Top;
double left = this.Left;

然后传递parentWindow的顶部和左侧给childWindow。当childWindow加载时,它应该设置topleft

在WPF中,您需要手动设置所有者窗口-它不会自动完成。从窗口。显示:

通过调用Show打开的窗口不会自动具有与打开它的窗户的关系;具体来说,是开放的窗口不知道是哪个窗口打开的。这种关系可以是使用业主财产建立,使用业主财产管理OwnedWindows财产。

因为你的加载窗口没有所有者,所以它将位于主显示器的中心。使用下面的代码:

private void btnShowLoading_Click(object sender, EventArgs e)
{
    Loading load = new Loading();
    load.Owner = this;
    load.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 
    load.Show();
}