2

我有两个显示器。当我的应用程序运行时,父级显示在第一台监视器上。当我将父窗口移动到第二个监视器并单击一个按钮(显示用于加载的 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();
}
4

2 回答 2

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;

然后将 的顶部和左侧传递parentWindowchildWindow. 加载时childWindow它应该设置topleft.

于 2013-03-21T14:54:18.017 回答
0

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

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

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

private void btnShowLoading_Click(object sender, EventArgs e)
{
    Loading load = new Loading();
    load.Owner = this;
    load.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 
    load.Show();
}
于 2013-03-21T16:39:54.033 回答