32章:WPF迷路の作成

    作成2013.04.23

     ここでは、Windowsフォームアプリケーション用サンプルコードをWPFアプリケーション用コードに変換します。フォームアプリケーションからWPFアプリケーションへの変化が最近の主流のようです。

  1. 参照元情報
    「迷路の作成」にジャンプする
    「WPF - Windows フォーム用のコントロールを使う」にジャンプする
     作成方法の詳細は上記を参照願います。


  2. フォームアプリケーションからWPFアプリケーションへの変更
     若干の変更でフォームアプリケーションからWPFアプリケーションへの変更ができます。
     完成ファイルは以下からダウンロードできます。
     ダウンロード後は解凍してから使用してください。
      [WPF迷路の作成]をダウンロードする。
     解凍すると「32WpfMaze」フォルダーがあります。
    注(1)「32WpfMaze」フォルダーの「WpfMaze.sln」ファイルをダブルクリックすると「Express 2012 for Windows Desktop」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「WpfMaze.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. WpfMaze.slnの実行
    (1)「Express 2012 for Windows Desktop」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)迷路が表示され、左上にカーソルが表示されます。
    (4)カーソルが青の壁に触れないようにFinishラベルに到達するとゲーム終了です。
    (5)カーソルが青の壁に触れるとカーソルが左上に戻ります。
    (6)Closeボックスをおすとプログラムは終了します。


  4. プロジェクトの構成
    (1)UserControl1.vbの構成
    ・Panel1を配置します。

    (2)XAMLコードの構成
    ・Labelを配置します。

    注:Panel1がフォームアプリケーション用のツールとなります。(スタートポイント設定用です。)


  5. MainWindow.xamlの全コード
    <Window x:Class="WpfMaze.MainWindow"	
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"	
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"	
            xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 	
        xmlns:self="clr-namespace:WpfMaze"	
        Title="MainWindow" Height="432" Width="507" AllowsTransparency="False" IsTabStop="False">	
        <Grid Name="Grid1">	
            <Grid.RowDefinitions>	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="48*" />	
                <RowDefinition Height="0*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
                <RowDefinition Height="24*" />	
            </Grid.RowDefinitions>	
            <Grid.ColumnDefinitions>	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
                <ColumnDefinition Width="*" />	
            </Grid.ColumnDefinitions>	
            <WindowsFormsHost x:Name="wfHost" >	
                <self:UserControl1 x:Name="myControl"  />	
            </WindowsFormsHost>	
            <Label Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="2" Grid.RowSpan="19"   Name="Label1" Background="Cyan" MouseEnter="wall_MouseEnter"></Label>	
            <Label Grid.Column="3" Grid.ColumnSpan="18" Grid.Row="0" Grid.RowSpan="1"   Name="Label2" Background="Cyan" MouseEnter="wall_MouseEnter"></Label>	
            <Label Grid.Column="21" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="20"   Name="Label3" Background="Cyan" MouseEnter="wall_MouseEnter"></Label>	
            <Label Grid.Column="1" Grid.ColumnSpan="18" Grid.Row="21" Grid.RowSpan="1"   Name="Label4" Background="Cyan" MouseEnter="wall_MouseEnter"></Label>	
            <Label Background="Cyan" Grid.ColumnSpan="17" Name="Label5" Grid.Column="1" Grid.Row="2"  MouseEnter="wall_MouseEnter"/>	
            <Label Background="Cyan" Grid.RowSpan="14" Name="Label6" Grid.Column="2" Grid.Row="4" MouseEnter="wall_MouseEnter" />	
            <Label Background="Cyan" Grid.ColumnSpan="17" Grid.RowSpan="2" Margin="0,0,0,23" Name="Label7" Grid.Column="2" Grid.Row="4"  MouseEnter="wall_MouseEnter"/>	
            <Label Background="Cyan" Grid.RowSpan="13" Margin="0,0,0,1" Name="Label8" Grid.Column="4" Grid.Row="6" MouseEnter="wall_MouseEnter" />	
            <Label Background="Cyan" Grid.ColumnSpan="13" Grid.RowSpan="2" Margin="0,0,0,23" Name="Label9" Grid.Column="6" Grid.Row="6" MouseEnter="wall_MouseEnter" />	
            <Label Background="Cyan" Grid.RowSpan="10" Margin="0,1,0,24" Name="Label10" Grid.Column="6" Grid.Row="7"  MouseEnter="wall_MouseEnter"/>	
            <Label Background="Cyan" Grid.RowSpan="9" Margin="0,0,0,1" Name="Label11" Grid.Column="8" Grid.Row="10"  MouseEnter="wall_MouseEnter"/>	
            <Label Background="Cyan" Grid.ColumnSpan="11" Grid.RowSpan="2" Margin="0,0,0,23" Name="Label12" Grid.Column="8" Grid.Row="8"  MouseEnter="wall_MouseEnter"/>	
            <Label Background="Cyan" Grid.RowSpan="9" Margin="0,0,0,1" Name="Label13" Grid.Column="13" Grid.Row="9" MouseEnter="wall_MouseEnter" />	
            <Label Background="Cyan" Grid.ColumnSpan="3" Grid.RowSpan="2" Margin="0,0,0,23" Name="Label14" Grid.Column="10" Grid.Row="12" MouseEnter="wall_MouseEnter" />	
            <Label Content="Finish " Grid.Column="17" Grid.ColumnSpan="2" Grid.Row="18" Grid.RowSpan="1"  Name="finishLabel" Height="20" VerticalAlignment="Bottom" MouseEnter="finishLabel_MouseEnter"  />	
        </Grid>		
    </Window>	
    


  6. MainWindow.xamlコードの解説
    (1)<Window>階層1:クラス:以下の記載が特別です。
     xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
     上記の記載はUserControlを使用するための記載です。
     xmlns:self="clr-namespace:WpfMaze"
     上記の記載はWpfMazeソリューションを使用するための記載です。
    (2) <WindowsFormsHost x:Name="wfHost" Grid.Row="0">
    <self:UserControl1 x:Name="myControl" />
    </WindowsFormsHost>
     上記の記載でUserControl1の使用条件を設定します。名前は"myControl" となります。
    (3)Grid機能を使用して迷路を作成します。
    (4)<Label Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="2" Grid.RowSpan="19" Name="Label1" Background="Cyan" MouseEnter="wall_MouseEnter"></Label>となりVBと比較してC#は記載が厳密になるようです。


  7. MainWindow.xaml.csの全コード
    using System;
    using System.Windows;
    
    namespace WpfMaze
    {
        public partial class MainWindow : Window
        {
            System.Media.SoundPlayer startSoundPlayer = new System.Media.SoundPlayer(@"C:\Windows\Media\chord.wav");
            System.Media.SoundPlayer finishSoundPlayer = new System.Media.SoundPlayer(@"C:\Windows\Media\tada.wav");
    
            public MainWindow()
            {
                InitializeComponent();
                MoveToStart();
            }
    
            private void finishLabel_MouseEnter(object sender, EventArgs e)
            {
                finishSoundPlayer.Play();
                System.Windows.MessageBox.Show("Congratulations!");
                Close();
            }
    
            private void MoveToStart()
            {
                startSoundPlayer.Play();
                System.Drawing.Point startingPoint =myControl.Panel1.Location;
                startingPoint.Offset(10, 10);
                System.Windows.Forms.Cursor.Position = myControl.PointToScreen(startingPoint);
            }
    
            private void wall_MouseEnter(object sender, EventArgs e)
            {MoveToStart();}
        }
    }
    


  8. MainWindow.xaml.csコードの解説
    (1)MessageBox.Show("Congratulations!");→System.Windows.MessageBox.Show("Congratulations!");となります。
    (2)Point startingPoint = Panel1.Location;→System.Drawing.Point startingPoint =myControl.Panel1.Location;となります。
    (3)Cursor.Position = PointToScreen(startingPoint);→System.Windows.Forms.Cursor.Position = myControl.PointToScreen(startingPoint);となります。


  9. Public Class UserControl1クラスのコード
     Public Class UserControl1クラスのコードの記載はありません。


    感想:
    (1)VBと比較してC#はより厳密な記述が要求されるようです。(極一部のコードですが)







33章:WPF計算クイズの作成に行く。

トップページに戻る。