本ブログはアフィリエイト広告を利用しています。

WPF 親ウインドウの真ん中にサブウインドウを表示する

wpf-centerプログラミング

ツールのメインウインドウからサブウインドウを表示する際に何も設定しないと色んな所にウインドウが出てきてしまいます。
これではサブウインドウで入力などさせたい場合に不便なのでメインウインドウの中央にサブウインドウを表示するようしていきます。

環境

  • .NET 6.0
  • Visual Studio 2022 v17.3.0 Preview 1.1

親ウインドウの中央に表示する方法

サンプルプロジェクトとしてメインウインドウのボタンをクリックすることでサブウインドウを表示するという簡単なものを用意しました。

やることは以下です。

  1. サブウインドウにWindowStartupLocation=CenterOwnerを設定(ソース、もしくはXAML)
  2. サブウインドウの親のウインドウとしてメインウインドウを設定

サブウインドウ

まずはサブウインドウのXAMLです。ソースの方はデフォルトで十分ですので省略します。
WindowStartupLocation=”CenterOwner” が親ウインドウの中央に表示するという設定となります。
ソースで指定する場合はこの設定は不要です。
余談ですがディスプレイの中央に表示したい場合は “CenterScreen” とします。

<Window x:Class="WPFTest.SubWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFTest"
        mc:Ignorable="d"
        Title="SubWindow" Height="250" Width="400"
        Name="Sub"
        WindowStartupLocation="CenterOwner">
    <Grid>
        <Label>サブウインドウを親ウインドウの中央に表示する</Label>
    </Grid>
</Window>

メインウインドウ

次に親となるウインドウのXAMLとソースです。
OpenSubWindow()内でOwnerで親となるウインドウ(this)を指定とXAMLで設定しなかった場合はWindowStartupLocationの設定を行います。
Ownerを指定してあげないとWindowStartupLocationを設定しても中央に表示されないので注意です。

<Window x:Class="WPFTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        WindowStartupLocation="CenterScreen">
    <Grid>
        <StackPanel>
            <Label HorizontalAlignment="Center">親ウインドウ</Label>
            <Button Content="サブウインドウを表示" Width="200" Click="OpenSubWindow"></Button>
        </StackPanel>
    </Grid>
</Window>
public MainWindow()
{
    InitializeComponent();
}

private void OpenSubWindow(object sender, RoutedEventArgs e)
{
    var sub = new SubWindow
    {
        Owner = this,
        WindowStartupLocation = WindowStartupLocation.CenterOwner
    };
    sub.ShowDialog();
}

実行してみる

このようにメインウインドウの中央にサブウインドウが表示されます。

wpf-center

以上です。

コメント

タイトルとURLをコピーしました