‘winrt’のエントリ

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に移行しているのでうまくいってよかった。


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

最近Analog Book Readerのダウンロード数が増えている。詳細を見るとUSを中心にWindows 10からのダウンロードが増えているよう。ただ、Windows 10で動かすとFlyout(ポップアップ)を表示するとボタンなどの色が変になるのが分かっていた。そこで、一日ウェザタイを止めて最近Analog Book ReaderのWindows 10対応をすることに。ストアにはもう申請したので少ししたらアップロードされるはず。

2015082301

詳細。どうもWindows 10でFlyoutを出すとテーマ色が変になってしまうみたいで、Windows 10のバグのような気がする。そのうち直るかも知れないけど見にくすぎるので、とりあえずテーマに関係なく色を固定してしまった。ハイコントラストとかにすると見づらいのかもしれないのでWindows 10が直してきたら元に戻そう。

あとWindows 10ではウィンドウモードで動くようになったのでドラッグアンドドロップとかサポートしたいけど、Universal Windows Appにしないとダメっぽい。ウェザタイ後にやるか。

Analog Book Reader 1.4に向けてWindows Storeに報告されているクラッシュレポートを見る。相変わらずどこで落ちているか分かりづらいけど,2つほど修正。

前にも少し書いたが,クラッシュ箇所の特定方法をアップデート。

  1. Windows 8.1 SDKからwindbgをインストール
  2. Defrag Toolsで配布しているPDE.dllのx86/x64版をそれぞれwindbgと同じフォルダにコピー
  3. 「プロジェクト\AppPackages」フォルダにあるappxsymをzipにした中身のpdfファイルと,appxbundleファイルをzipにした中身のappxファイルをzipにした中身のexeファイルを,「どこか\x64\symbols\exe」,「どこか\x86\symbols\exe」フォルダに配置
  4. windbgでdmpを開く
  5. シンボルの設定を「SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols; どこか\x64\; どこか\x86」に設定
  6. 「.reload /f xxx.exe」コマンドでシンボルをリロード。lmコマンドで読み込めていることを確認
  7. 「!pde.dse」コマンドでスタックトレースを表示
  8. スタック上にexeが出てくれば,Visual StudioでNativeデバッグしてdisassembleから関数内のオフセットを探す。出てこなければ・・・今のところ諦めるしかない?

Analog Book Reader 1.3.1を公開した。Windowsストアでもらったコメントに対応して,高解像度の画像を開いて縮小したときに画像が汚くなるのを改善した。

前回の日記で,winrtの画像補間がどれも同じ感じと書いたが,実際はFantアルゴリズムであればある程度よい結果が得られていた。ただ,ScrollViewerの拡大縮小の結果,ぼやけた感じになっていた。そこで,画像をスクリーンの大きさに合わせたものを等倍にすることで最適化することにした。今までと少し動きが変わるので,今までと比べて劣化することがあったら報告してもらえるとありがたい。

Analog Book Readerでは,ScrollViewer内に画像を表示しているのだが,そのままだとスケーリングで画像が汚くなってしまうので,一旦画像をZoomFactor倍してからScrollViewerで表示している。デフォルトのアルゴリズムでは,拡大はある程度大丈夫だが,縮小は汚くなってしまうのが今回の問題。そこで補間アルゴリズムをFantにしたのだが,結局縮小した画像をScrollViewerがZoomFactorによってさらに縮小し,ScrollViewerの大きさに合わせて拡大しているような動作になっていた。そのため,画像がぼやけてしまう。いろいろ調べてみたがいい案はない。RenderOptionsが使えればScrollViewerで補間付きの拡大縮小ができるのだが,winrtにはない。ScrollViewerの拡大率が変わったときに画像を拡大縮小して拡大率を1.0に戻すのも検討したが,動作がおかしいので却下。そこで発想を変えて,画面の大きさを拡大率1.0にするようにした。これなら,画像を画面にぴったり合わせたときが一番綺麗に見えて,そこから拡大縮小したときも多少は見栄えがよくなる。今まで高解像度の画像があると,最大限に縮小してもあまり縮小できなかった問題も解決することができてよい案かとは思う。が,今までうまく見えていた画像がぼやけたりすることがあるのでは,と少し怖い。手元の本ではうまく見えてはいるけど・・・。

しばらく開発してなかったので思い出すために軽くライブタイル対応してみた。ワイドと大の2種類のライブタイル対応をしたかったのだが,検索しても複数のサイズに対応させるやり方を書いたものがなく,最終的にQuickstart: Sending a tile updateを参考にした。テンプレートを2つ作って,最初のテンプレートの「visual」にもう一つのテンプレートの「binding」を追加すればOK。

ライブタイル対応で各本のサムネイルをキャッシュするようにしたので,本棚表示する時のサムネイル表示を速くしてみた。一応たくさん本があっても快適にはなった。

いろいろ使っていて,バグを発見。Analog Book Readerでファイルを開いて,一旦デスクトップを表示してからもう一度開くと,カーソルキーがきかなくなる。デバッガを使っていると再現しないので今まで気付かなかった。OnNavigatedToでWindow.Current.CoreWindow.KeyDownイベントを登録してOnNavigatedFromで解除しているのだが,デスクトップを表示するとOnNavigatedToなしでOnNavigatedFromが呼ばれるので,KeyDownイベントが解除されてしまっていた。NavigationModeを見て,本棚に戻るときだけ解除するようにして解決した。

今週末,新しいアプリのテストを終わらせようと思っていたのだが,できなかった。BitmapSource.SetSourceを呼び出すと,どうも内部的に画像のメモリを確保するらしいのだが,いつまでも解放されない。いろいろWebで調べた末,使い終わったら1ピクセルの画像で初期化するという解決策をとった。この問題で週末いっぱいかかってしまったので,多分今月中のリリースは無理。

Windows 8.1でサポートされたFlyoutをxamlに入れてみる。でもFrameworkElementを継承していないので,プロパティへのバインディングができない。結構困った結果,FyoutBase.ShowAtで指定したElementのDataContextにバインディングされることが分かった。

Weather Typingランキングより作りたいものができてしまった。ので,ランキングリニューアルはちょっと保留してそっちを作り始めてみる。


てことでVisual Studio 2013 RCを入れてWindowsストアのアプリを作り始めた。Windowsのデスクトップとかスマートデバイスとかも将来的に動かしたいので,まずはWindowsストアかな。.NET framework 4.5のAPIをWebで検索するんだけど,そのAPIがどの環境で動くのかさっぱり分からない。いろんなバージョンとか環境がありすぎる。

PurentroをWindows RTで動かすために,Windows RTでのMIDIサポートを調べる。結果,無理と言うことが分かった。いろいろ調べていたら,結構WPFとWindows RTは違うのか。じゃあ何を作ろうかなあ。