双监视器父子窗口问题

时间:2013-03-21 14:49:27

标签: c# wpf

我有两台显示器。当我的应用程序运行时,父项将显示在第一台监视器上。当我将父窗口移动到第二个监视器并单击一个按钮(显示用于加载的xaml窗口)时,此子窗口将保留在第一个监视器上。有没有办法让子窗口与父窗口保持一致,无论父窗口位于何处?

请注意:父母是winform ...孩子是xaml。

加载xaml(孩子)

<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();
}

2 个答案:

答案 0 :(得分:0)

试试这个:

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

更新1:

获取父窗口的位置并将其设置为子窗口。 如果您认为父窗口的状态发生了变化,您可以使用它来获得实际的顶部和左侧:

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。 在这种情况下,您可以像这样获取parentWindow的TopLeft

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

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

答案 1 :(得分:0)

在WPF中,您需要手动设置所有者窗口 - 它不会自动完成。来自Window.Show

  

通过调用Show打开的窗口不会自动拥有   与打开它的窗口的关系;具体来说,开了   窗口不知道哪个窗口打开了它。这种关系可以   使用Owner属性建立并使用   拥有Windows属性。

由于您的“加载”窗口没有所有者,因此它将以主监视器为中心。请使用以下代码:

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