SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

UWP悪戦苦闘日記 その1 WPFにあってUWPに無いものがある

こいついつも悪戦苦闘してんな

まず余談

さて、前回書いた通り、UWPの勉強始めました。

hiroronn.hatenablog.jp

そしたら、ここ何日かの間に、こんなニュースもありました。

pc.watch.impress.co.jp

記事の一文に、

Microsoftは先日、Windowsストアアプリのみがインストール可能な「Windows 10 S」を文教向けと位置付けて発表したが、同OSを法人向けにも展開することを考えており、Windowsストアアプリの不足を埋めるためにかなりの力を注いでいるようだ。

とある通り、やっぱり法人向け展開があるようです。
(当初の記事にもあったんですけどね。あと、iTunesが法人向け展開されてもしょうがないんですけどね)

というわけで、勉強は続けます。

勉強法

こういう新しいものは、習うより慣れるのが一番です。

さあ早速、適当にアプリを作りましょう!

作成前に

とはいえ、一から作るのも面倒なので、既存のテンプレートを使います。
(一からMVVMパターン作るのも、難しくはないけど面倒)

f:id:hiroronn:20170508215230p:plain

前回のブログでも出しましたが、「Template 10」を使います。使いました。

Template 10 Template Pack - Visual Studio Marketplace

github.com

作ろうとしたもの

簿記で言うところの、「社債の償却原価法」の計算ツールを目指すことにしました。
本当はファイナンスリースの計算が良いのですが、まずは簡単なものから…ということで。

起動

使い方は、上のGitHubに書いてありますが、簡単に書くと、

  1. プロジェクトを作る
  2. ソリューションを「クリーン」する
  3. ソリューションを「リビルド」する

すると、NuGetから必要なライブラリを参照しなおしてくれるので、動作します。

とりあえず必要な機能(入力周り)

まずは、以下のデータ入力です。

  • 原価
  • 利率
  • 年数

年数は、Sliderを使います。(最長20年)
他はTextBoxです。
こんな感じになります。

f:id:hiroronn:20170512205245p:plain

次に、原価と利率の入力ですが、以下の制限を付けます。

  • 原価
    数値のみ
  • 利率
    小数を許可

なのですが…

違い その1

UWPでは、IMEを無効にできないようです。*1

Windwos FormWPFのころは、それぞれ、TextBox.ImeModeプロパティやInputMethodクラスで制御できました。*2

まあ、こんなのは複雑になるだけだし、いくら画面の入力制限を付けても、受け入れ側でチェックする必要はあります。
(Webのリクエストなら、事前チェックは必須)

できないなら仕方ないし、悩んでも仕方ない、というわけで、方針変更。
遷移時にチェックします。

幸い、WPFのころは、「INotifyDataErrorInfo」というクラスがあり、それをViewModel側で指定すると、画面側にエラー有無を表示できました。
こう、DataAnnotationで属性を付けたりとか、そういうやつです。

違い その2

なんと、XAMLINotifyDataErrorInfo等をサポートしなくなったようです。

ソースはこちら↓(README.MD)

github.com

In Windows UWP XAML/C# apps, developers will discover that input controls do not support DataAnnotation or ExceptionValidationRule or IDataErrorInfo or INotifyDataErrorInfo or BindingValidationError

だそうな。
無いとかあんのかよ(´・ω・`)

解決策

生産性を確保しつつ、Viewをリッチな感じにするなら、上のリンクにあるライブラリを使ったり、Prismを使いましょう、ということでしょう。

Prismが無いと相当難しい、ということはわかりました。

感想

まあ、UWPはWindowsのサブセットだからね。仕方ないね。

今後も折を見て投稿できたらなーと思います。
わざわざ「その1」ってつけたので、その2もいつか出ると思います!

*1:CoreTextServicesManager というクラスから制御できるのかもしれません。やり方知っている人は教えてほしい

*2:カスタムチェックなら、 Behavior 使えば可能。同じ手法はUWPでも使えるけど、WPFと同じではない感じ