■はじめに
今回は画面レイアウトの続きと、別画面の表示の仕方についてやります。
[注意]
これまでの回で説明済みの操作方法等は、説明を省略したり簡略化している場合があります。
■開発環境
- Windows 10
- Visual Studio Community 2015 Update 3
- .NET Framework 4.x
■ドキュメントアウトライン
まず、画面が入り組んでくると便利なツール、ドキュメントアウトラインを表示しておきます。
メニューの「表示」 - 「その他のウィンドウ」 - 「ドキュメントアウトライン」を選択します。
フローティング状態にするなりドッキングするなり好きな場所に配置してください。
コントロールの階層構造がツリー形式で表示でき、ここからコントロールの選択もできます。
■Grid
◇マウスで行、列分割
Gridを3行、2カラムにします。
ドキュメントアウトラインでGrid
を選択し、画面デザイナのGrid上端あたりにマウスをポイントしてください。
そうすると黄色い線が表示されるはずなので、大体真ん中あたりでクリックしてください。
はい、Gridが2カラムになりました。
次にGridの左端の上の方をマウスクリックしてください。
もう一か所、1行目と同じぐらいの行の高さになるようクリックしてください。
これで3行になります。
■メイン画面作成
◇ボタンの配置
Gridの1行目左側にButton
をドラッグ&ドロップしてください。
Gridの1行目右側、3行目左側、3行目右側にそれぞれButton
をドラッグ&ドロップしてください。
◇ボタンのプロパティ設定
画面デザイナで4つのボタンを全て含むよう、対角線上にドラッグしてください。
プロパティウィンドウで「レイアウト」カテゴリのWidth
に150、Height
に30、HorizonalAlignment
とVerticalAlignment
にCenter
を設定してください。
Margin
プロパティ右端の■
をクリックして「リセット」を選択してください。
これでボタン配置時に設定されたMarginプロパティを削除します。
Margin
プロパティが無くなったので、4つのボタンがそれぞれのセルの中央に表示されるようになりました。
Button
のContent
プロパティを以下のように設定してください。
<Button x:Name="button" Content="ダイアログ1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="150" Height="30"/>
<Button x:Name="button1" Content="ダイアログ2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="150" Height="30"/>
<Button x:Name="button2" Content="次の画面に移動" HorizontalAlignment="Center" Grid.Row="2" VerticalAlignment="Center" Width="150" Height="30"/>
<Button x:Name="button3" Content="新しい画面表示" Grid.Column="1" HorizontalAlignment="Center" Grid.Row="2" VerticalAlignment="Center" Width="150" Height="30"/>
◇テキストの配置
TextBlock
をGrid
の2行目・左側にドラッグ&ドロップし、
名前(x:Name)にtextBlock
とつけてください。
■ダイアログの作成
◇ダイアログ画面作成
新しい項目でウィンドウを1つ追加してください。
名前はDialogWindow1.xaml
にします。
以下のように画面を作成してください。
Window
のWindowStyle
プロパティは最小化ボタン・最大化ボタンが無いToolWindow
に設定します。
2つのボタンはダブルクリックしてイベントハンドラを設定します。
<Window x:Class="WpfApplication5.DialogWindow1"
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:WpfApplication5"
mc:Ignorable="d"
Title="DialogWindow1" Height="150" Width="300" WindowStyle="ToolWindow">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock x:Name="clickButtonText" Text="TextBlock" Margin="10"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="OK" Width="80" Margin="0,10,10,10" IsDefault="True" Click="Button_Click"/>
<Button Content="キャンセル" Width="80" Margin="0,10,10,10" IsCancel="True" Click="Button_Click_1"/>
</StackPanel>
</Grid>
</Window>
DialogResult
プロパティに値を設定するとウィンドウが終了します。
処理を確定するような終了の場合はtrue
を、キャンセル的な終了の場合はfalse
を設定します。
// OK時
private void Button_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
// キャンセル時
private void Button_Click_1(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
◇ダイアログ表示処理の作成
MainWindow.xaml
に戻り、Content
がダイアログ1
のボタンをダブルクリックして以下の処理を記述します。
先ほど作成したダイアログを表示する処理です。
// ウィンドウ生成
var window = new DialogWindow1();
// 生成したウィンドウのテキストに文字列設定
window.clickButtonText.Text = (sender as Button).Content + "が押されました。";
// ウィンドウ表示
bool? res = window.ShowDialog();
// DialogResultをチェック
if (res == true)
{
textBlock.Text = "OKでダイアログが終了。";
}
else
{
textBlock.Text = "キャンセルでダイアログが終了。";
}
イベント名を右クリックし、「名前の変更」でdialogButton_Click
に書き換えて「適用」ボタンを押します。
MainWindow.xaml
のボタン定義で、Content
がダイアログ2
の方にクリックイベントをコピペし、2つのボタンが同じイベントハンドラを呼び出すようにします。
<Button x:Name="button" Content="ダイアログ1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="150" Height="30" Click="dialogButton_Click"/>
<Button x:Name="button1" Content="ダイアログ2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="150" Height="30" Click="dialogButton_Click"/>
■ダイアログ動作確認
ここまでで一度実行してみましょう。
ダイアログが表示されました。
呼び出し元のボタンのContent
がメッセージ部分に表示されています。
ShowDialog
で表示したウィンドウは閉じるまで呼び出し元の画面には戻れません。
OK
ボタンで終了します。
MainWindow
のテキストが設定されました。
次は「ダイアログ2」ボタンを押してみます。
今度も呼び出し元のContent
がメッセージに反映されています。
キャンセル
で閉じてみます。
■別ウィンドウに移動、GridSplitter
新しい項目の追加でウィンドウを追加してください。
名前はWindow1.xaml
にします。
Gridの淵をクリックして3×3に分割します。
縦横中央を細めにしてください。
ツールボックスにg
を入力してフィルタリングし、GridSplitter
を2つ、ドラッグ&ドロップしてください。
タグを以下のように編集してください。
<GridSplitter
x:Name="gridSplitter_H"
Grid.Column="1" Grid.RowSpan="3"
Width="5"
HorizontalAlignment="Stretch"/>
<GridSplitter
x:Name="gridSplitter_V"
Grid.Row="1" Grid.ColumnSpan="3"
Height="5"
HorizontalAlignment="Stretch"/>
真ん中のカラム幅を調整します。
赤枠のあたりにマウスをポイントしてください。
行も同じくGridの真ん中の行、左端あたりにマウスカーソルを持っていき、Auto
を選択してください。
タグを以下のように書き換えます。
<Rectangle
Grid.Row="0" Grid.Column="0"
Fill="Aqua"/>
<Rectangle
Grid.Row="0" Grid.Column="2"
Fill="AntiqueWhite"/>
<Rectangle
Grid.Row="2" Grid.Column="0"
Fill="Aquamarine"/>
<Rectangle
Grid.Row="2" Grid.Column="2"
Fill="Blue"/>
ボタンを配置し、Content
を前の画面に戻る
に設定してください。
ボタンをダブルクリックし、Clickのイベントハンドラに以下を入力してください。
this.Close();
ドキュメントアウトラインでWindow
を選択し、プロパティのイベントでClosing
の欄をダブルクリックします。
ウィンドウ終了時の処理、Closingイベントに以下の処理を書きます。
// メイン画面を表示する
App.Current.MainWindow.Show();
MainWindow.xaml
に戻り、「次の画面に移動」ボタンのイベントハンドラを作成します。
// ウィンドウ生成
var window = new Window1();
// ウィンドウ表示
window.Show();
// 自身(MainWindow)を隠す
this.Hide();
真ん中の部分をドラッグしてサイズを変えられます。
「前の画面に戻る」ボタンを押すとWindow1は終了し、非表示にしていたMainWindowが表示されます。
■別ウィンドウ表示
普通のウィンドウ表示をやります。
新しい項目の追加でウィンドウを追加してください。
名前はWindow2.xamlにします。
MainWindowの「新しい画面表示」ボタンのイベントハンドラに以下を入力してください。
// ウィンドウ生成
var window = new Window2();
// ウィンドウ表示
window.Show();
実行してみます。
「新しい画面表示」ボタンを押すとWindow2がMainWindowの上に表示されます。
ダイアログ表示ではないのでMainWindowも触ることができます。
「新しい画面表示」ボタンを何度も押すと、どんどんWindow2が新たに表示されます。
MainWindowとすべてのWindow2を閉じるとプログラムが終了します。
おしまい