我有两台显示器。当我的应用程序运行时,父项将显示在第一台监视器上。当我将父窗口移动到第二个监视器并单击一个按钮(显示用于加载的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 :(得分: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:
首先,您必须告诉parentWindow
是WinForms
。
在这种情况下,您可以像这样获取parentWindow的Top
和Left
:
double top = this.Top;
double left = this.Left;
然后将parentWindow
的顶部和左侧传递给childWindow
。加载childWindow
后,应设置top
和left
。
答案 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();
}