2013-03-21 63 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