SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Windowsで進化するマルチプラットフォームGUI開発

マルチプラットフォームなGUI「Avalonia UI」で予測気温表示アプリを作ろう

Windowsで進化するマルチプラットフォームGUI開発 第6回

  • このエントリーをはてなブックマークに追加

 数年前からMicrosoftは、Windows onlyから脱却して、マルチプラットフォーム戦略を打ち出しています。その戦略はデスクトップ向けのGUIアプリにもおよび、マルチプラットフォームで動作するアプリの開発ができるさまざまなライブラリやフレームワークが提供されるようになってきました。本連載では、Windows環境におけるマルチプラットフォームGUI技術(.NET以外も含む)について、(主にC#の)サンプルコードをまじえて解説します。

  • このエントリーをはてなブックマークに追加

はじめに

 Windows環境で開発可能なマルチプラットフォームGUI技術を解説してきた本連載も今回で最後になりました。最終回は前回の続きの予測気温表示アプリを解説し、アプリを完成させます。

対象読者

 C#の基礎的な知識がある方を対象とします。C#の基本文法などの解説は割愛します。

予測気温表示アプリ──ボタンの追加とコマンドの実装

 前回は、予測気温表示アプリのコンボボックス部分を解説しました。残りの処理を追加していきましょう。

ビューへボタン要素を追加する

 まずはボタンを追加します。このボタンを押すことで、選択された県庁所在地の気温表示を行うようにします。

 ビューのMainWindow.axamlの<ComboBox>の下に、UI要素のボタン<Button>を追加します。

[リスト1]MainWindow.axaml
<StackPanel HorizontalAlignment="Center">
~中略~
    </ComboBox>
    <Button HorizontalAlignment="Center" Margin="0,10,0,10" Width="120" Command="{Binding OnClickCommand}">24時間先の気温</Button>
</StackPanel>

 MVVMパターンでは、ボタンを押すなどのイベント処理は、コマンドというものにバインディングする形になります。Avalonia UIでは、WPF同様に、ボタンにコマンドをバインディングすることでイベント処理を行えます。<Button>のCommand属性に、ボタンを押した場合に呼び出される処理を記述します。ここでは、プロパティ名をOnClickCommandとしています。

MVVMパターンのコマンド処理

 次にコマンドの実装なのですが、これがやや面倒です。WPF同様に、次のような流れになります。

  1. ICommandインターフェイスを実装したコマンドクラスを作成し、実行したい処理をExecuteメソッドに記述する。
  2. ビューモデルでコマンドクラスを生成し、そのインスタンスをプロパティで公開する。
MVVMパターンのコマンド処理
MVVMパターンのコマンド処理

 このように、ビューやビューモデルからコマンド処理を切り離すことで、単体でテストが行えるようになります。

 ただし、ボタンひとつのイベント処理でも、MVVMパターンではコード量が多くなりがちです。そのため、よりシンプルに記述できるオープンソースのMVVMパターン用のライブラリ(フレームワーク)が存在します。そのひとつに、ReactiveUIというものがあり、実はAvalonia UIのテンプレートプロジェクトにも含まれています。

 ReactiveUIのReactiveCommandという、静的メソッドを定義したユーティリティクラスを使うと、コマンド処理がよりシンプルに記述できます。ビューモデルのMainWindowViewModelクラスに、次のようなコマンド処理を追加します。

[リスト2]MainWindowViewModel.cs
public class MainWindowViewModel : ViewModelBase
{
    public ReactiveCommand<Unit, Unit> OnClickCommand { get; }

    public MainWindowViewModel(string filePath)
    {
        ~中略~
        OnClickCommand = ReactiveCommand.Create(OnClick);
    }

    private void OnClick()
    {
        // ボタンクリック時の処理
    }
}

 ボタンがクリックされると、OnClickメソッドが実行されることになります。

ボタンクリック後の結果表示

 次は、ボタンをクリックした後の処理で、テキストを表示するようにしてみましょう。まずは、テキスト表示をする<TextBlock>を、MainWindow.axamlに追加します。

[リスト3]MainWindow.axaml
<StackPanel HorizontalAlignment="Center">
~中略~
    </Button>
        <TextBlock HorizontalAlignment="Center" Text = "{Binding Result}" />
</StackPanel>

 そして、バインディングしているResultプロパティを、MainWindowViewModelクラスに追加します。

[リスト4]MainWindowViewModel.cs
public class MainWindowViewModel : ViewModelBase
{
    // テキスト表示
    public string Result { get; set; } = string.Empty;

    ~中略~

    private void OnClick()
    {
        Result = "ボタンクリック";
    }
}

 また、OnClickメソッドで、Resultプロパティを書き換えるようにします。これで、一度実行してみましょう。

ボタン追加
ボタン追加

 ボタンをクリックしたら、文字が表示されましたか?

コントロールの書き換え通知

 じつは、先ほどの処理では、ボタンをクリックしてもテキストが表示されません。確かにプロパティ自体は更新されるのですが、ウィンドウの<TextBlock>は、更新されないのです。

 <TextBlock>を動的に更新するには、プロパティの更新時に、RaiseAndSetIfChangedメソッドを呼び出します。このメソッドにより、プロパティの内容が変更されている場合は、画面が更新されていることが通知され、画面の書き換え処理が実行されます。

private string result = string.Empty;
public string Result
{
    get => result;
    set => this.RaiseAndSetIfChanged(ref result, value); 
}

 ボタンをクリックすると、次のように表示されるはずです。

ボタンクリックの実行
ボタンクリックの実行

 今度は、選択された県庁所在地を表示してみましょう。MainWindowViewModelクラスのOnClickメソッドを次のように変更します。

[リスト5]MainWindowViewModel.cs
private void OnClick()
{
    if (Capitalpoint.Name != string.Empty)
    {
        Result = Capitalpoint.Name;
    }
    else
    {
        Result = "県庁所在地を選択してください ";
    }
}

 コンボボックスから県庁所在地を選択して、その後ボタンをクリックすると、選択された県庁所在地が表示されます。

 コンボボックスで選択した値は、Capitalpointプロパティを通じて参照できます。したがって、Capitalpoint.nameをResultプロパティに代入すると、画面に表示されるというわけです。

県庁所在地の表示
県庁所在地の表示

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
予測気温表示アプリ──JSON処理とAPIの呼び出し

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Windowsで進化するマルチプラットフォームGUI開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17316 2023/03/01 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング