2

2台のモニターを持っています。アプリケーションを実行すると、親が最初のモニターに表示されます。親ウィンドウを 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

WPF では、オーナー ウィンドウを手動で設定する必要があります。これは自動的には行われません。Window.Showから:

Show を呼び出すことによって開かれるウィンドウは、それを開いたウィンドウと自動的に関連付けられるわけではありません。具体的には、開かれたウィンドウは、どのウィンドウを開いたかを認識しません。この関係は、Owner プロパティを使用して確立し、OwnedWindows プロパティを使用して管理できます。

Loading ウィンドウには所有者がいないため、プライマリ モニターの中央に表示されます。以下のコードを使用します。

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 に答える
0

これを試して:

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

更新 1:

親ウィンドウの位置を取得し、子ウィンドウに設定します。親ウィンドウの状態が変化したと思われる場合は、これを使用して実際の Top と Left を取得できます。

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

ソース:ウィンドウ ActualTop、ActualLeft

更新 2: まず、 が であることを伝えなければなりませんでしparentWindowWinForms。この場合、parentWindow を次のTopようLeftに取得できます。

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

次に、 の上部と左側を に渡しparentWindowますchildWindowchildWindow読み込まれると、 と が設定されtopますleft

于 2013-03-21T14:54:18.017 に答える