たくさんの自由帳

.NET CoreでWPFアプリ作るぞ

投稿日 : | 0 日前

文字数(だいたい) : 4455

.NET Coreってなに

ほんだい

WPFなんてめったに触らんから未来の私がWPFやる時に見に来る記事。
WPFアプリ作ったのでその時に躓いたこ

環境

なまえあたい
OSWindows 10 Pro 2004
Visual StudioCommunity 2019

.NET Coreってなに

しらない。なんかよくわからんけど使う。
.NET Coreはクロスプラットフォームって言われてるけど、WPFに関してはWindowsに依存してるから関係ないよ

ソース

Visual Studio 2019 入れる

最新版入れましょう。最新版じゃないとWPF App (.NET Core)が選べないと思います。
ちなみに私は最新版にアップデートする際、ダウンロードするファイルが3GBを超えてました。クソ長かったわ。

プロジェクト作成

検索ボックスにwpfって入れれば出ます。
.NET Frameworkじゃないほうを選びましょうね。 Imgur

その後のプロジェクト名とかは各自決めてね。

ぷよぐらみんぐ

久々のC#くんです。
(多分)Androidと同じ感じで、xamlでレイアウト決めて、C#でプログラムを書いていく感じですが、ちょっと違うのね。

  • AndroidのfindViewById
    • C#ではレイアウトにName付けとけばC#から扱える。
    • KotlinでfindViewByIdが省略できるみたいな感じで書ける。

レイアウト

MainWindow.xaml

<Window x:Class="DotNetCoreWPF.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:DotNetCoreWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBox FontSize="20" HorizontalAlignment="Center" Name="TimeTextBox" Text="" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center" Height="30" Width="228"/>

    </Grid>
</Window>

真ん中にテキストを表示するTextBoxを置いただけです。

C#

MainWindow.cs 上のusingは省略してるので気をつけて

namespace DotNetCoreWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // タイマー初期化
            var dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
            dispatcherTimer.Start();

        }

        // タイマーで毎秒ここ呼ばれる。
        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            // 時間を表示
            TimeTextBox.Text = DateTime.Now.ToString();
        }

    }
}

これでデジタル時計の完成です。はっっや

Imgur

exeにする

.NET Framework時代ではどうやってexeを配布してたのかよくわかりませんが、
.NET Coreでは自己完結型が使えるそうです。(.NET Frameworkじゃできない?)

自己完結型 #とは

必要なもの全部を一つのexeファイルにできる機能。
ちょっと前だとWindowsのフリーソフトを入れる際に、.NET Framework のバージョンなんとか以上が必要みたいなやつがよくありましたが、
.NET Core(正確には3.0から)では.NET Core(.NET Frameworkの後継)が入っていないPCでも実行できるように、.NET Coreのランタイムやらなんやらを一つのexeにいれて環境に関係なく動くようになるらしい。
変わりにファイルサイズが大きくなるけど。

今回は.NET Core ランタイム入り(.NET Core入ってないPCでも動くやつ).NET Coreのランタイム無しの両方をやろうと思います。

ソリューションエクスプローラー開いて

名前のところを押して発行を押します。

Imgur

フォルダーを選んで次へ

Imgur

そのまま完了押して良いと思います。

Imgur

そしたら後ろのVS 2019の内容が画像のように変わるので、構成のところの鉛筆マークを押します。

Imgur

そしてこの先は作りたいexeファイルによって操作が変わります。

.NET Core ランタイム入りのexeファイルを作成する

プロファイル設定で、配置モード自己完結にします。
それから、下のファイルの公開オプションを押して、単一ファイルの作成にチェックを入れます。

Imgur

そしたら保存して、発行ボタンを押せば作成されます。 作成されたexeファイルbin/Release/netcoreapp3.1/publishの中にあると思います。

実際に起動してみたの図。これだけなのにファイルサイズでけえ。 Imgur

.NET Core ランタイム無しのexeファイルを作成する

プロファイル設定で、配置モードフレームワーク依存にします。
それから、下のファイルの公開オプションを押して、単一ファイルの作成にチェックを入れます。

Imgur

そしたら保存して、発行ボタンを押せば作成されます。 作成されたexeファイルbin/Release/netcoreapp3.1/publishの中にあると思います。

実際に起動してみたの図。ファイルサイズは小さい。

Imgur

おわりに

これで正解なのかはよく分かっていない。

というかなんでTextBox使ったの?TextBlockで良かったじゃん。

一応ソースコード置いときますね→ https://github.com/takusan23/DotNetCoreWPF

あと少しずれるんだけど、画像を入れても何故かコケる問題。画像を右クリックしてプロパティ選んで、ビルドアクションをリソースにすればいいのね。時間奪われた。

参考にしました

ありがとうございます

https://www.telerik.com/blogs/creating-a-single-exe-application-with-net-core

https://techinfoofmicrosofttech.osscons.jp/index.php?.NET%20Core%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4

https://rksoftware.hatenablog.com/entry/2019/02/17/194701