web-dev-qa-db-ja.com

WPF-メインウィンドウを基準にしてダイアログウィンドウの位置を設定しますか?

独自のAboutBoxを作成していて、Window.ShowDialog()を使用して呼び出しています。

メインウィンドウを基準にして、つまり上から20ピクセル、中央に配置するにはどうすればよいですか?

20
empo

Window.Left および Window.Top プロパティを使用するだけです。メインウィンドウからそれらを読み取り、ShowDialog()メソッドを呼び出してAboutBoxbeforeに値(プラス20ピクセルなど)を割り当てます。

AboutBox dialog = new AboutBox();
dialog.Top = mainWindow.Top + 20;

中央に配置するには、 WindowStartupLocation プロパティを使用することもできます。これを WindowStartupLocation.CenterOwner

AboutBox dialog = new AboutBox();
dialog.Owner = Application.Current.MainWindow; // We must also set the owner for this to work.
dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;

AboutBoxの幅に応じて水平位置を計算する必要があるため、垂直方向ではなく水平方向の中央に配置する(つまり、垂直方向の位置を固定する)場合は、AboutBoxが読み込まれた後にEventHandlerでそれを行う必要があります。 、およびこれは、ロードされた後にのみ認識されます。

protected override void OnInitialized(...)
{
    this.Left = this.Owner.Left + (this.Owner.Width - this.ActualWidth) / 2;
    this.Top = this.Owner.Top + 20;
}

gehho。

40
gehho

WPFを頼りに計算するのではなく、手動で計算します。

System.Windows.Point positionFromScreen = this.ABC.PointToScreen(new System.Windows.Point(0, 0));
PresentationSource source = PresentationSource.FromVisual(this);
System.Windows.Point targetPoints = source.CompositionTarget.TransformFromDevice.Transform(positionFromScreen);

AboutBox.Top = targetPoints.Y - this.ABC.ActualHeight + 15;
AboutBox.Left = targetPoints.X - 55;

ここで、ABCは親ウィンドウ内のUIElementです(必要に応じてOwnerにすることもできます)。また、ウィンドウ自体(左上のポイント)にすることもできます。

幸運を

2
Li3ro