VB.NET GUI画面作成 チュートリアル1

# 🥚1. はじめに

「Visual Studio 2019」「Visual Basic .NET」を使ってデスクトップアプリのGUI画面を作ります。
Visual Studioをインストールするところから始めます。
画面を作る部分にフォーカスした入門記事です。

# 🥚2. 環境

* Windows 10（Version 20H2）
* Visual Studio Community 2019（Version 16.8.2）

# 🥚3. Visual Studio 2019の準備

## ◇3-1. Visual Studioを持っていない人の場合

Visual Studio 2019を持っていない場合は、以下からCommunity版をダウンロードしてインストールしましょう。
![010_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/df2d3e76-d47e-c5bb-e1e9-d6353241f93c.png)
🔗 [Visual Studio 2019 for Windows のダウンロード](https://visualstudio.microsoft.com/ja/downloads/)

「ワークロード」で「.NET デスクトップ開発」を選択して「インストール」ボタンを押してください。
![020_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/89680495-6090-b6b0-ff11-2bdbfb40523d.png)

Microsoftアカウントを持っている場合はサインインしましょう。
持っていなくて今アカウントを作成する場合は「作成してください。」リンクを選択してください。
とりあえず先に進めたい場合は「後で行う。」リンクを選択してください。（Visual Studioを使い続ける場合はいずれアカウント登録が必要になります）
![025_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/b66b07cf-4a27-7919-b84b-84f675ad2134.png)

「Visual Studioの開始」ボタンを押します。
![030_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/761c4026-2c47-9689-c562-c7c1e31bb8ff.png)

## ◇3-2. Visual Studioをすでに持っている人の場合

スタートメニューから「Visual Studio Installer」を起動し、
![031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/67f3a00a-c1f4-dfd2-c177-660aa3131fa1.png)
「変更」ボタンを押して
![032_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/d24a18cf-a2ae-294b-aec2-f9dd26fc6a50.png)

「ワークロード」タブで「.NET デスクトップ開発」にチェックが入っていることを確認してください。
入っていなかったらチェックを入れて「変更」ボタンを押してインストールします。
準備が整ったらVisual Studioを起動しましょう。

# 🥚4. プロジェクトの作成

「新しいプロジェクトの作成」ボタンを押します。
![035_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/d1627028-73ed-81e6-2103-842aafeeb5d3.png)

言語のプルダウンから「Visual Basic」を選択してプロジェクトテンプレートを絞り込みます（上の検索ボックスに`wpf`と入力すればさらに絞り込めます）。
「WPF アプリ（.NET Framework）」を選択し、「次へ」ボタンを押します。
![040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/c42f345b-4678-47ef-8d27-1db625922dc4.png)

「プロジェクト名」に`Sample1`と入力します。「場所」は好きな保存先を指定してください。
「フレームワーク」はなるべく数字の大きいものを選択してください。ここでは`.NET Framework 4.7.2`を選択しました。
「作成」ボタンを押します。
![045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/35d873a6-8d05-2e47-84fd-608a2008a9f2.png)

# 🥚5. 開発環境の説明、表示設定

![050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/e966120d-407e-eeb6-8941-f372dea694bc.png)

| #    | 名称                                                    | 説明                                                 |
| ---- | ------------------------------------------------------- | ---------------------------------------------------- |
| 1    | ツールボックス                                          | 配置できるコントロールを一覧表示します。           |
| 2    | ドキュメント アウトライン                              | コントロールの階層構造を表示します。           |
| 3    | XAMLデザイナー デザインビュー（以後「デザインビュー」と表記） | 画面イメージです。画面定義コードと同期しています。   |
| 4    | XAMLデザイナー XAMLビュー（以後「XAMLビュー」と表記）   | 画面定義のコードです。画面イメージと同期しています。 |
| 5    | ソリューション エクスプローラー                          | プログラムのファイル構成を表示します。             |
| 6    | プロパティ ウィンドウ                                   | コントロールの設定値（プロパティ）を編集します。     |

まずはツールボックスが左端に隠れているので常に表示するようにしましょう。
「ツールボックス」タブをクリックすると一時的にツールボックスが表示されるので、
ピンのアイコンを・・・
![055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/1de9133c-cf2b-3763-ea7d-bef5b000ce61.png)
クリックして横向きになっているのを縦向き（ピン留め状態）にします。
![060.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/90e41965-fbf4-3378-66ee-0a4ea5c50d67.png)

次に「ドキュメント アウトライン」を常時表示します。
左端に「ドキュメント アウトライン」のタブがない場合は、メニューの「表示」-「その他のウィンドウ」-「ドキュメント アウトライン」を選択します。
![065.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/724f0a8e-4520-0716-1783-f00accfdd4fb.png)

そしてツールボックスと同じようにピンで固定します。
![070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/d760f808-8a59-7a41-82b4-8f69a4726974.png)

* ツールボックス
* デザイナー（デザインビュー、XAMLビュー）
* ドキュメント アウトライン
* ソリューション エクスプローラー
* プロパティ ウィンドウ

ひととおり存在を確認できたでしょうか。
見つからないものがある場合、メニューの「表示」から表示させてください。
各ウィンドウを移動やドッキングさせすぎて収集つかなくなってしまった場合はメニューの「ウィンドウ」-「ウィンドウ レイアウトのリセット」で元に戻しましょう。

# 🥚6. 拡張機能のインストール

VBのコードでも改行・インデントで読みやすくするのと同様、
画面定義のコードも読みやすくなるよう気を付けましょう。

```xml:Bad
<Xxxxxx Xxxxxxx="xxxxxx" Xxxxxxxxxxxxxxxxxxx="Xxxxxx" Xxxxxx="x" Xxxxxxxxxxxxxxxxx="Xxx" Xxxxx="xx" Xxxxxxxxx="Xxxx" Xxxxxx="xx" Xxxxxxxx="xx"/>
```

```xml:Good
<Xxxxxx
    Xxxxxxx="xxxxxx"
    Xxxxxxxxxxxxxxxxxxx="Xxxxxx"
    Xxxxxx="x"
    Xxxxxxxxxxxxxxxxx="Xxx"
    Xxxxx="xx"
    Xxxxxxxxx="Xxxx"
    Xxxxxx="xx"
    Xxxxxxxx="xx" />
```

しかし自動生成で付け足されたコードを毎回手作業で修正する必要はありません。
画面を保存時にコードを自動整形してくれる拡張機能があります。

さっそく導入しましょう。
メニューの「拡張機能」-「拡張機能の管理」を選択します。
「拡張機能の管理」画面で「Visual Studio Marketplace」が選択されている状態で
検索ボックスに`xaml`と入力します。
検索結果の「XAML Styler」の「ダウンロード」ボタンを押します。
![075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/6ad978e3-8296-6bdb-ae22-65c6cc4459dc.png)
ダウンロードが完了したら「拡張機能の管理」画面を閉じ、Visual Studioもすべて終了させます。
![080.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/f743d481-3712-6681-4e3b-8aeb9267d6bf.png)
「Modify」ボタンを押します。
![085.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/78bb8382-8736-4b44-a6fd-87c465ee291a.png)
インストール完了です。「Close」ボタンを押します。
![090.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/e4b54179-e21b-41dc-f9e9-86b414d6adaf.png)

# 🥚7. いきなり実行

Sample1プロジェクトを開いたらツールバーの「開始」ボタンを押してみます。
![100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/9caf9fac-dcca-15d2-8415-c2a8985f6075.png)
プログラムがビルド（実行ファイル生成）されて、起動します。
タイトルバーにデバッグ用のツールバーが表示されているので右端をクリックして最小化しておきましょう。
![105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/91dbc91c-89d5-2882-e397-75ab820e081e.png)
　↓
![110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/1e7ca9a3-5278-13ac-89ae-5794c5b5600c.png)
　↓
![115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/4800b7d8-ecaa-760c-cd1b-c58cc7203a52.png)

起動した画面のタイトルバーの×ボタンを押して終了しましょう。

「ソリューション エクスプローラー」のツリーで「Sample1」ソリューションの一階層下の「Sample1」プロジェクトを右クリック、「エクスプローラーでフォルダーを開く」を選択します。
![120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/0a9b9cd8-3395-b27c-a97c-122f155b724c.png)

先ほどは「Debug」モードで実行したので、
![125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/d3ac5b4a-0a94-120d-d4f4-7dbf5fe153f0.png)
「bin」フォルダーの下の「Debug」フォルダーを開きます。
（「Release」モードでビルドした場合は「Release」フォルダーを開きます）
![130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/cc56d80e-9141-ca92-2211-0ddb048c4f63.png)
「Sample1.exe」をダブルクリックします。
![140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/eca77175-78c2-c2a9-93f2-4db71b01f170.png)
Visual Studioから実行したときと同じ画面が表示されました。
×ボタンで終了してください。

# 🥚8. コントロールを配置してみる

レイアウトを気にせず、簡単な動作確認するのに向いた画面作りをします。

## ◇8-1. レイアウトの種類の変更

「デザインビュー」または「ドキュメント アウトライン」で「Grid」を右クリック、「レイアウトの種類の変更」-「StackPanel」を選択します。
※デザインビューで薄く緑で囲った白い部分がGridです。
![145_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/779274da-3649-e889-6c65-49645acd9460.png)

デザインビュー上の見た目は変わりませんが、「Window」の直下のコントロールが「Grid」から「StackPanel」に変わりました。
![150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/94cee62d-0e10-4fea-50b4-52d073c0838f.png)

## ◇8-2. 足し算用コントロールの配置

ボタンを押すと2つのテキストボックスに入力された数値を足して結果を表示する、というのを作ります。
そのためにまず、必要なコントロールを配置します。

ツールボックスから「TextBox」を、「デザインビュー」の「StackPanel」上にドラッグ＆ドロップします。
![155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/98e74fd8-39d9-48d6-754d-2912a714fcf4.png)

「StackPanel」に「TextBox」が追加されました。「ドキュメント アウトライン」「デザインビュー」「XAMLビュー」に反映されています。
![160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/4e4c5fff-1e80-09ef-9eef-e137db87e07e.png)

ちゃんとStackPanelの下層にTextBoxが入ったでしょうか？
失敗した場合はツールバーの「元に戻す」ボタンでやり直してください。
![165.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/0573d1ae-319c-a18f-f78e-acdc7148ed25.png)

続けて「TextBlock」⇒「TextBox」⇒「Button」⇒「TextBlock」の順でコントロールを「StackPanel」の中に放り込んでください。
※「TextBlock」と「TextBox」はスペルが似ているので間違えないようにしましょう。
![170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/94f9d256-c131-cfd9-40f6-18ea350e4416.png)

## ◇8-3. ボタン2つ配置

ドキュメント アウトラインも使ってみましょう。
「Button」を2つ、「StackPanel」の中にドラッグ＆ドロップしてください。
![175.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/b989a7a9-bb90-655a-bc79-ca6720dbf690.png)

![180.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/f97a84ce-e5c2-0e65-ff59-6e290dfa21e9.png)

# 🥚9. コントロールのプロパティ設定

コントロールのプロパティを設定します。

「ドキュメント アウトライン」「デザインビュー」「XAMLビュー」のどれでもよいので、
一番上の「TextBox」を選択し、
![185.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/96c9cb3c-a701-c2fe-f7d1-40e3ab8a9606.png)

「プロパティ ウィンドウ」の「名前」に`Num1`を、「共通」-「Text」に`123`と入力してEnterキーを押してください。
「XAMLビュー」の「TextBox」に`x:Name="Num1"`と`Text="123"`が追加されています。
「デザインビュー」も「123」とテキストが表示されています。
![190.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/60c73203-4cc8-8faa-b2f2-3cc46713d758.png)

続いて上から2番目の項目「TextBlock」を選択し、「共通」-「Text」に`+`を入力、
3番目の「TextBox」を選択し、「名前」に`Num2`を、「共通」-「Text」に`456`を入力、
4番目の「Button」を選択し、「名前」に`計算ボタン`を、「共通」-「Content」に`=`を入力、
5番目の「TextBlock」を選択し、「名前」に`結果テキスト`を入力してEnterキーを押してください。
![195.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/00add2b8-c29c-35cf-cf28-3977d680459a.png)

ここまででいったん保存しましょう。
保存するとXAML Stylerの効果で「XAMLビュー」の内容が整形されます。
![200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/d9201546-5ff5-1730-1621-4af1dbcef054.png)

# 🥚10. ボタンを押したときの処理を書く

## ◇10-1. 足し算処理

「デザインビュー」で「=」の計算ボタンをダブルクリックします。
![205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/e10cc79d-2d75-fe7a-dd70-1721fe438ec3.png)

すると、「MainWindow.xaml」のタブから「MainWindow.xaml.vb」のタブに飛んで
ボタンクリック時のイベントハンドラが作成されました。
![210_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/a651100a-abaf-ea84-1c59-99fb95903b7f.png)

vbファイルは「ソリューション エクスプローラー」からも表示できます。
画面定義のxamlファイルの三角をクリックすると対になるvbファイルが表示されます。
![215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/fd24fc31-8982-c67f-7b63-d12b140604e5.png)

計算ボタンの処理に戻りましょう。
`try`と入力してください。
![220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/9f2f2fad-51da-2d07-31c3-7ffe2e03c408.png)

入力候補が表示されて「Try」が選択状態になっているのでそのままEnterキーを押します。
![225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/e1a4096b-153d-657e-405b-b9cdcec740fc.png)

TryとCatchの間に以下を入力してください。

```vb
結果テキスト.Text = CLng(Num1.Text) + CLng(Num2.Text)
```

入力候補に表示される★は、よく使われるプロパティやメソッドで、オススメとして一覧の上位に表示されます。
![230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/02ba3a72-e122-d8fa-9adb-3b75d43a59b9.png)

CatchとEnd Tryの間に以下を入力してください。

```vb
結果テキスト.Text = ex.ToString()
MessageBox.Show("計算に失敗しました。")
```

![235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/4c120e4e-ef98-2ae3-07de-27959b04b07a.png)

## ◇10-2. 2つのボタンの処理

「MainWindow.xaml」のタブに戻って下から2番目の「Button」をダブルクリックしましょう。
![240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/91f3ecee-c752-abbf-7c45-956ce8558e1a.png)

そしてボタンクリック時の処理として以下を入力します。

```vb
Me.Title = "縦にながーく"
Me.Height = 600
Me.Width = 200
```

![245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/f621efb2-0bbe-5f51-d832-670f7d7c33bf.png)

今度は別のやり方でイベントハンドラを作成してみましょう。
「MainWindow.xaml」のタブを選択し、一番下の「Button」を選択し、
「プロパティ ウィンドウ」で稲妻のマークをクリックします。
そして「Click」のテキストボックス内でダブルクリックします。
![250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/7d78c9c1-99d9-49d3-2d0d-d48cd85ffed4.png)

以下を入力します。

```vb
Me.Title = "横にながーく"
Me.Height = 200
Me.Width = 800
```

![255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/bce68f82-3be7-f72a-7673-bfdd37d9fe74.png)

完成です。

# 🥚11. 実行してみる

ツールバーの「開始」ボタンを押します。
![256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/3247c2bd-20f7-a8a6-18d3-4dd40bac24b4.png)

画面が表示されました。
![260.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/16ee73fb-3c2c-c132-650f-85403ac2f21e.png)

「=」ボタンを押すと計算結果が下に表示されます。
![265.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/cac644f9-c9e6-5ab0-d47d-37438107e4e4.png)

わざと数字以外を入れて「＝」を押すとエラー情報とメッセージボックスが表示されます。
![270.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/2b6fb69e-b2c4-5f83-869d-8d9d514a0042.png)

「＝」の下の2つのボタンを押すと、画面が縦に長くなったり横に長くなったりします。
画面サイズが変わっても中のコントロールは自動的にサイズ変更してくれます。
![275.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/1712a6c3-3dca-9037-9e75-a94bf4209b73.png)
![280.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/42e32181-0227-aa67-d180-392954a8e363.png)

# 🥚12. 作成コード

最後に作成したコードを載せます。

```xml:MainWindow.xaml
<Window
    x:Class="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:local="clr-namespace:Sample1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <StackPanel>
        <TextBox
            x:Name="Num1"
            Height="23"
            Text="123"
            TextWrapping="Wrap" />
        <TextBlock Text="+" TextWrapping="Wrap" />
        <TextBox
            x:Name="Num2"
            Height="23"
            Text="456"
            TextWrapping="Wrap" />
        <Button x:Name="計算ボタン" Content="=" />
        <TextBlock
            x:Name="結果テキスト"
            Text="TextBlock"
            TextWrapping="Wrap" />
        <Button Click="Button_Click" Content="Button" />
        <Button Click="Button_Click_1" Content="Button" />
    </StackPanel>
</Window>
```

```vb:MainWindow.xaml.vb
Class MainWindow
    Private Sub 計算ボタン_Click(sender As Object, e As RoutedEventArgs) Handles 計算ボタン.Click
        Try
            結果テキスト.Text = CLng(Num1.Text) + CLng(Num2.Text)
        Catch ex As Exception
            結果テキスト.Text = ex.ToString()
            MessageBox.Show("計算に失敗しました。")
        End Try
    End Sub

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Me.Title = "縦にながーく"
        Me.Height = 600
        Me.Width = 200
    End Sub

    Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
        Me.Title = "横にながーく"
        Me.Height = 200
        Me.Width = 800
    End Sub
End Class
```

---

[1]　[　2　](https://qiita.com/Kosen-amai/items/fce7ad50d8a7ceb03420)　[　3　](https://qiita.com/Kosen-amai/items/b451a69617eb0dd6637a)　[　4　](https://qiita.com/Kosen-amai/items/a49eaea47ac5c13bf01b)　[＞](https://qiita.com/Kosen-amai/items/fce7ad50d8a7ceb03420)