2013-03-21 79 views
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(); 
} 
+0

什么样的类型加载是? – Dilshod 2013-03-21 18:49:30

回答

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

+0

不,不起作用。 – user1884032 2013-03-21 14:57:54

+0

然后尝试获取parentWindow的位置并将其设置为childWindow。 – Dilshod 2013-03-21 15:00:52

+0

我试过你提供的代码,并将它分配给孩子的左/顶,但仍然是相同的结果。 – user1884032 2013-03-21 15:41:16

0

在WPF中,您需要手动设置所有者窗口 - 它不会自动完成。从Window.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(); 
} 
+0

我的父窗口是一个winform控件,而孩子是一个xaml(窗口)控件。我不知道如何设置子窗口的所有者。当我将所有者设置为父窗口时,出现错误“无法将类型system.windows.forms.form隐式转换为system.windows.window。 – user1884032 2013-03-21 17:12:37

+0

您是否在WindowsFormsHost中托管winform控件?如果是这样,您会如果不是,你如何将WinForms和WPF相结合? – shf301 2013-03-21 18:29:22

+0

不,我有一个winform可以通过命名空间访问xaml。 – user1884032 2013-03-21 18:34:45