WPF ウィンドウの表示

今回はWPFのウィンドウを表示する方法についてです。

表示方法はShow、ShowDialog、Visibilityがあるようです。

ShowとVisibilityはモードレスウィンドウになります。

モードレスウィンドウは他の操作をブロックしません。

SDI(Single Document Interface)を実装する場合はこれらを方法で行います。

 モーダルウィンドウはShowDialogメソッドを利用します。

 

それぞれのモーダル性を試したいと思います。

分離コードファイルを作成します。

using System;
using System.Windows.Controls;
using System.Windows;

namespace Test {
  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }
    public void ShowClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = "新しいWindowをShow";
      w.Show();
    }

    public void VisibilityClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = "新しいWindowのVisibility";
      w.Visibility = Visibility.Visible;
    }

    public void ShowDialogClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = "新しいWindowShowDialogで表示";
      w.ShowDialog();
    }
  }
}

 

MainWindow.xamlを作成します。

Window
  x:Class=\'Test.MainWindow\'
  xmlns:x=\'http://schemas.microsoft.com/winfx/2006/xaml\'
  xmlns=\'http://schemas.microsoft.com/winfx/2006/xaml/presentation\'
  Title=\'Hello World\'>
  <WrapPanel>
    <Button Click=\'ShowClicked\'>Show</Button>
    <Button Click=\'VisibilityClicked\'>Visibility</Button>
    <Button Click=\'ShowDialogClicked\'>ShowDialog</Button>
  </WrapPanel>
</Window>

 他のプロジェクトファイルやアプリケーションオブジェクトを用意し、

MSBuild等でコンパイルします。これでモーダル性が表現できました。

 

上記のソースでモードレスウィンドウを作成すると親のウィンドウを閉じても

子のモードレスウィンドウは残ったままになります。

一般的なアプリケーションでフローティングしているウィンドウがあると思いますが、これはモードレスウィンドウで親となっているウィンドウを閉じると他の子ウィンドウも閉じます。これをWPFで表現する場合はOwnerプロパティを設定します。

分離コードファイルを下記のように書き換えます。

using System;
using System.Windows.Controls;
using System.Windows;

namespace Test {
  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }
    public void ShowClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Owner = this;
      w.Title = \"新しいWindowをShow\";
      w.Show();
    }

    public void VisibilityClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = \"新しいWindowのVisibility\";
      w.Visibility = Visibility.Visible;
    }

    public void ShowDialogClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = \"新しいWindowShowDialogで表示\";
      w.ShowDialog();
    }
  }
}

 子ウィンドウは常に親ウィンドウの上に表示されますが、親ウィンドウの操作も可能です。