C#でWPFでHello worldしてみた

C#でWPFのデスクトップアプリを作ってみました。初めてのWPFアプリです。といっても、Hello Worldです。今までWindows Formsで作ってきていて問題無かったのですが、個人的なツールとはいえ、もうそろそろWPFに切り替えようかと思いまして。また、作ったアプリをディスプレイ解像度を変えて動作を見てみます。 アプリの作成環境は下記です。

  • Visual Studio Express 2015 for Windows Desktop (C#)

  • Windows8.1

  • Dynabook KIRA V832 (13.3インチ 2560x1440ディスプレイ)

目次

  1. Hello worldアプリを作る
    1. アプリのレイアウトを作る
    2. データの準備をする
    3. データとコントロールを結びつける
  2. ディスプレイ解像度を変えて動かしてみた
    1. 比較のためWindows Formsのアプリも作った
    2. Windows Formsアプリは解像度の違うディスプレイでどうなる?
    3. WPFアプリは解像度の違うディスプレイでどうなる?

Hello worldアプリを作る

まず、WPFのアプリを作ります。Visual Studioを起動して新規のプロジェクトでWPFのデスクトップアプリを選択すると、こういう画面になります。Windows Formsアプリに比べて、ウィンドウが1つ多く開いています。初めては緊張しますね。 151217-1-01 今回作るHello Worldは、フォームにテキストボックスとボタンを1つずつ配置して、ボタンをクリックするとテキストボックスにHello Worldと表示するという簡単なものです。

アプリのレイアウトを作る

最初に、アプリのレイアウトを作ります。これは、Windows Formsアプリと同じような感じで、フォームにコントロールをドラッグアンドドロップして、配置を整えていきます。 最初にレイアウトウィンドウに配置されているフォームがちょっと大きいので適当に小さくして、そこにテキストボックスとボタンを配置します。 151217-1-02 テキストボックスのプロパティウィンドウで、フォントをMeiryo UIの10ポイントにします。 151217-1-03

データの準備をする

データを保持するために、クラスを作ります。プロジェクトウインドウのプロジェクトを右クリックして、右クリックメニューの中の「追加」→「クラス」を選択します。 151217-1-04 そうすると、何を追加したいのか選択するウィンドウが開きますので、「クラス」を選択し、コードのファイル名を入力して、「追加」をクリックします。 151217-1-05 すると、クラスファイルがプロジェクトに追加されます。今回はPiyo.csを追加しました。 151217-1-06 続けて、Piyo.csを編集します。Piyo.csを開いて、下記のように、Hogeというプロパティだけを持つクラスにしました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace hello_world_wpf
{
    public class Piyo
    {
        public string Hoge { get; set; }
    }
}

このクラスのインスタンスをテキストボックスに表示させます。

データとコントロールを結びつける

データとコントロールを結びつけます。コントロールにインスタンスをバインドすると言うとC#的でしょうか。 MainWindow.xamlを開くと、デザイナウィンドウの下に、XMLが書いてあるウィンドウが開いていますよね。 151217-1-07 ここに、アプリの外観レイアウトの定義が書かれています。textBox要素の中にtextというプロパティがありますので、それをText="{Binding Path=Hoge}"と書き換えます。textBoxのTextプロパティをHogeとバインドするんだよという感じでしょうか。変更後のXMLは下記のようになります。

<Window x:Class="hello_world_wpf.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:hello_world_wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="164.472" Width="218.123">
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="38,83,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
        <TextBox x:Name="textBox" Text="{Binding Path=Hoge}" HorizontalAlignment="Left" Height="50" Margin="38,19,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" FontSize="13.333"/>
    </Grid>
</Window>

いよいよ、ボタンをクリックするイベントのコードを書きます。フォームデザイナのボタンを選択して、プロパティウィンドウの稲妻ボタンをクリックすると、プロパティウィンドウにイベントの一覧が表示されます。「click」のところのテキストボックスをダブルクリックすると、コードウィンドウが開いて、ボタンのクリックイベントが自動的に記述されます。 151217-1-08 ボタンのクリックイベントのところに、下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace hello_world_wpf
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            // この3行を記述する。
            Piyo foo = new Piyo();
            foo.Hoge = "Hello World!\r\n with WPF";
            textBox.DataContext = foo;
        }
    }
}

記述したコードは3行だけです。1行目で、fooという名前のPiyoクラスのインスタンスを作ります。2行目で、fooのHogeプロパティに文字列を入れます。3行目はtextBoxのDataContextプロパティに、fooというインスタンスを結びつけます。 アプリをビルドして実行すると、下図のようになります。 151217-1-09 ボタンを押すと、テキストボックスにHello Worldと表示されました。 151217-1-10

ディスプレイ解像度を変えて動かしてみた

MicrosoftはWPF推しだと思いますが、そもそもWPFはベクター形式で描画をするので、ディスプレイ解像度の影響を受けないと聞きました。そこで、ディスプレイ解像度を変えて試してみたいと思います。

比較のためWindows Formsのアプリも作った

上記のWPFのHello Worldは、221dpi(13.3インチ 2560x1440 DPIスケーリング185%)という環境でVisual Studioを使って作りました。同じ環境で、Windows FormsのHello Worldアプリを作ります。 textBoxのMultLineプロパティをtrueにして、改行を有効にしました。また、textBoxのフォントをMeiryo UIの10ポイントに指定しました。フォームデザイナでのレイアウトは下図のようにしました。 151217-1-11 コードは下記の通りです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace hello_world_windowsforms
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Hello, World!\r\n with windows forms";
        }
    }
}

Windows Formsに慣れきってるので、コントロールのプロパティを直接いじるのがわかりやすくて・・・ 出来上がったアプリの動作は、WPFのHello Worldと同じく、ボタンを押すとテキストボックスにHello Worldが表示されます。

Windows Formsアプリは解像度の違うディスプレイでどうなる?

まず、Windows Formsアプリを試してみます。 最初は、221dpi(13.3インチ 2560x1440 DPIスケーリング185%)で実行してみます。背景はFireFoxにしてみました。FireFoxのロゴの横に、Hello Worldアプリが見えます。 151217-1-12 ディスプレイの解像度を110dpi(1280x720 DPIスケーリング100%)にしてみました。 151217-1-13 あれ?ほとんどレイアウト変わりませんね。アプリ内にラスター画像が無いので、影響が少ないのでしょうか。ただしこのアプリをWindows7の端末で動かしてみたら、テキストボックスの右端とフォームの枠の距離がかなり変わりました。環境によっても変わるんですね。 151217-1-14

WPFアプリは解像度の違うディスプレイでどうなる?

WPFアプリを試してみます。まずは、221dpi(13.3インチ 2560x1440 DPIスケーリング185%)で実行してみます。 151217-1-15 ディスプレイの解像度を110dpi(1280x720 DPIスケーリング100%)にしてみました。 151217-1-16 このアプリをWindows7で動かしてみましたが、Windows7でもほぼレイアウトは変わりませんでした。やはりWPF(XAML)アプリの方が、解像度変化の影響を受けにくそうです。 151217-1-17

公開日

広告