‘UWP’のエントリ

Weather TypingのUWP化でネックになるネイティブC++の部分。C#に移植するのはそんなに大変ではないのだが、ネイティブ部分を使えるといろいろ便利なので調査。

まず普通にネイティブDLLを作ってUWPからP/Invokeしてみるが、あっさり成功。Windows IoTでもそのまま動いた。禁止されているAPIを使っていなければそのまま動くらしい。

てことで試しにWindowsストア用にビルドして、Windows App Certification Kit(WACK)にかけてみるが、「vccorlib140.dll is not supported for this application type」でWindows Security Features Testに失敗する。問題なさそうなmemsetとかmemcpyとかが引っかかっているので、どうもデスクトップ用のライブラリを見ているためっぽい。

ネイティブDLLのプロジェクトプロパティに「Consume Windows Runtime Extension」というのがあり、Using C++/CX in Desktop appsを参考に有効にしてみるが変わらず。

最終的にHow to: Use Existing C++ Code in a Universal Windows Platform Appというそのままのヘルプが見つかったのでそれに従って、上のC++/CXに加えてプロジェクトファイルを直接書き換えたりプリコンパイルヘッダの名前を変えたりしてWACKに通るようになった。

できあがったDLLをDependancy Walkerで見てみると、元々リンクしていた「VCRUNTIME140.DLL」とか「MSVCP140.DLL」が「VCRUNTIME140_APP.DLL」「MSVCP140_APP.DLL」になっていて、これがUWP用ってことか。

Analog Book Readerの更新でWindowsストア用パッケージを作成していたのだが,数日はまった。

まずストア用証明書の有効期限が切れていてパッケージをビルドできない。テスト用証明書を作成し直してみたのだが,ここでPackage Family Nameが変わってしまって別製品になってしまう,ように見えたのでいろいろ試していたのだが,結局ストアとの関連づけをやり直すことで元のPackage Family Nameに戻った。

次。前のバージョンからのアップデートを試したいのだが,前のバージョンも期限切れでインストールできない。そこでシステムの日付を無理矢理元に戻してインストールしてうまくいった。

次。日本語OSで英語が表示される。これはV1.7のときもそうだったっぽい。V1.7はUWPなのでWindows 10しか動かないが,日本人の新しいもの嫌いでWindows 10の普及率が低いため問題にはなってない,と考えておこう。で,原因はよく分からない。パッケージの中に「_language-ja.appx」が入っていればOKなのだが,何故か入らないこともある。とりあえずアップロードする前に日本語でテストする必要があるってことか。ダウンロード数からいってもはや日本語サポートする意味はあまりないけど。

てことで,Analog Book Reader V1.8をストアに申請したのでもう少しで公開されるはず。

UWPアプリを公開する前に読んでおかないと,ということでずっとUWP UXガイドライン(PDF版)を読んでいたのだが,ようやく読み終わった。それほど新しいことはなかったけど,アイコン周りとSegoe MDL 2は参考になったかな。

ガイドラインとは関係ないけど,Windows StoreのKPIとしてクラッシュ回数も関係しているという話をどこかで読んで,GW中にひたすらバグFixしていた。1ヶ月でクラッシュ600回が多いのかよく分からないけど,ほとんどが読み込み中の操作っぽいのでかたっぱしから修正。多少ランキングに貢献するのかなあ。

Analog Book ReaderのUniversal Windows Platform(UWP)化を進めているのだが,折角UWPにするならWindows 10 Mobileも試してみたい。てことでエミュレータも試さすにいきなりFREETEL KATANA02を購入。安かったので。。。

どうやれば自作ストアアプリを試せるのか分からないけど,いきあたりばったりでやってみる。とりあえず開発者モードに変更して,PCとUSBで接続。Visual StudioをDeviceモードにして,ARMデバッグしてみた。お,いきなり動いた。スゴイ。さすがUWP。でもUIがごちゃごちゃしてるのと動作が遅い。このままPhone対応で公開してもしょうがない。てことで次のリリースではPhone非対応にしよう。

2016042901

で,少し触ってみたのだが,意外に今使っているNECのAndroid(Medias N-04E)の代わりになるかも。Outlook使えるからDocomoメールも受信できそうだし,サービス系はEdgeでなんとかいけるし。ただ,GPSの精度が少し悪いかな。Docomo SIM入れてA-GPS的な感じにしてみたけど,2ブロックくらいずれる。散歩に使うのに少し厳しいかも。

Analog Book ReaderのUWP移行がひとまず完成。GW中にテストをしてアップロードできるかな。

前回の宿題としては,GridViewの選択についてはとりあえず右クリックで行うことにした。バージョン情報ダイアログはUWP sampleのUI Basic SampleにあるようにPopupで対応した。

UWP対応だけでは寂しいので,ずっと直したかった画像のぼやけを修正。今のバージョンでは,画像をCanvasの機能で拡大縮小しているため,拡大縮小の精度が悪い。キャンバス自体を拡大率に合わせて大きくしたり小さくしたりすれば画質が高くなるのだが,WinrtではLayoutTransformが使えないため,難しかった。そこはUWPでも同じなのだが,Silverlight toolkitのLayoutTransformerクラスをUWP化して使っている例があり,同じように対応した。だいぶ画質が上がるはず。

Weather Typing 3の作業が一段落なので,以前からやりたかったAnalog Book ReaderのUniversal Windows Platform対応を検討。UWPプロジェクトを作って既存のソースコードを追加,ビルドし直すところまではサクサクできたが,動かしてみるといろいろおかしなところがある。

  • 戻るボタンが動かない
  • ダイアログのレイアウトが崩れる
  • Semantic zoomがマウスでできない
  • ScrollViewerのズームがマウスでできない
  • GridViewで右クリック選択できない
  • ドラッグアンドドロップができない
  • チャームがない

戻るボタンについては自分でボタンを付けるのではなくタイトルバーに付けられるようになっていた。確かにWindows 10のアプリはそうなっているのでそれでOK。

var view = SystemNavigationManager.GetForCurrentView();
view.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
view.BackRequested += OnBackRequested;

レイアウトはまあ仕方ないので地道に直そう。


Semantic zoomに関してはMSのサンプルでもできないし,標準の時計アプリもズームできなくなっている。MSとしてはなかったことにしようとしてるのかなあ。

追記。と思ってもう少し調べたら以下のコードでできた。下のScrollViewerと同じで,ZoomModeを設定しないとホイールズームが使えない。



ScrollViewerのズームはScrollViewer.ZoomModeを設定することでできるようになった。Windows 8でもあったようだけど,デフォルト値が違うのかな。


GridViewで右クリック選択できないのは一番困るのだが,Windows 8.1では,右クリックで選択,左クリックで開くという動作ができたけど,Windows 10ではどちらかの動作しかできない。

ホント? と思ってWindows 10のスタートメニューを試したら確かに選択ができなくなっている。複数のタイルを移動したくなっても1つずつドラッグしないといけないのか。ずっとこの仕様でいくのかな。タブレットでもSwipe選択がなくなっているような・・・。


ドラッグアンドドロップができないのはWindows 10で増えたプロパティDragEventArgs.AcceptedOperation にDragOverから設定してやればOK。ついでに

if (e.DataView.Contains(StandardDataFormats.StorageItems))
{
    var storage = await e.DataView.GetStorageItemsAsync();
}

でファイルのドラッグアンドドロップができるようになる。まさにこれがやりたくてUWPに移行しているのでうまくいってよかった。


チャームは,どうやるのが正しいのだろう。バージョン情報をどこで出すのか? ということだけど,メニューからやるのかな。未調査。