.NET Core 3.x + VB でも Wpf がしたい！

# はじめに
これは、[Visual Basic Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vb)の21日目の記事となります。

前回記事で「[.NET Core 3.x + VB でも WinForms がしたい！](https://qiita.com/yaju/items/a52087c84d27d426fe01)」で、Windows フォームアプリケーションをやりましたので、WPF アプリケーションを今回やります。

# テンプレートにVBが無い
@tfukumori さんの「[VB.NETの.NET CoreにおけるWinForms、WPFのサポートはどうなるのか](https://qiita.com/tfukumori/items/0c0702b8c542c0ab054e)」記事にあるようにテンプレートにVBがありません。

下記サイトによるとVBのサポートは残念ながら `.NET 5` になったようです。`.NET 3.1`でも駄目でした。

* [.NET Core 3.0 VB WPF/Winforms Templates are disappeared](https://developercommunity.visualstudio.com/content/problem/725398/net-core-30-vb-wpfwinforms-templates-are-disappear.html)
* [Remove WPF VB Templates #1734](https://github.com/dotnet/wpf/issues/1734)

既存のプロジェクトテンプレートだとVBには対応していませんが`.csproj`と同じような形に`.vbproj`ファイルを書き換えればVBでもWPFアプリケーションを作成することが可能です。

## 環境
* Visual Studo 2019 Version 16.5 Preview 1
* .NET Core SDK 3.1

# プロジェクトファイル
VBでもやってみました。

```xml:VBWpfApp.vbproj
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWPF>true</UseWPF>
    <StartupObject>Sub Main</StartupObject>
  </PropertyGroup>

</Project>
```

特筆すべき点は特にないかもしれませんが、`Sdk`を`"Microsoft.NET.Sdk.WindowsDesktop"`に、`<OutputType>`を`WinExe`に、`<UseWPF>`を`true`に設定するぐらいでしょうか。あと、`<StartupObject>`を`Sub Main`にしています。

```xml:VBWpfApp.vbproj.user
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
  <ItemGroup />
  <ItemGroup>
    <Page Update="MainWindow.xaml">
      <SubType>Designer</SubType>
    </Page>
  </ItemGroup>
</Project>
```
# ソース
```xml:Application.xaml
<Application x:Class="Application"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:VBWpfApp"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        
    </Application.Resources>
</Application>
```

```vb:Application.xaml.vb
Class Application

    ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
    ' このファイルで処理できます。

End Class
```

テキストボックスとボタンを配置した画面になります。

```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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:VBWpfApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="233" Width="338">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Height="37" Margin="102,100,0,0" VerticalAlignment="Top" Width="111" RenderTransformOrigin="-0.009,0.135" Click="Button_Click"/>
        <TextBox x:Name="testText" Height="24" Margin="0,43,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"/>

    </Grid>
</Window>
```

ボタンイベントでテキストボックスに"Hello! .NET Core 3.0"をセットします。

```vb:MainWindow.xaml.vb
Imports System.Windows

Class MainWindow
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        testText.Text = "Hello! .NET Core 3.0"
    End Sub
End Class
```

# 結果
![VBWpfApp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/39522ce5-f801-172a-e7a2-2b4a491d7614.png)

ボタンをクリックすると、テキストボックスに"Hello! .NET Core 3.0"がセットされました。

![VBWpfApp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/e20f76cb-6c0f-71d9-b2f0-2cf47f653983.png)

# 最後に
現時点で、Windows Forms が未だプレビュー状態なので WPF で作成するのがいいですかね。