UWP:PCと電話でDatagramSocketの挙動が異なる2015年08月14日 13:25

ユニバーサルWindowsアプリ、Mobileエミュレータでテストを始めると、Datagram SocketのConnectAsyncの2回目からエラーが出る。

a blocking operation in progress

ブロッキング操作が実行中?

a blocking operation in progress

Windows Socketのエラー一覧を見ると、WSAEINPROGRESSのエラー。エラー対処では、時間をおいて再試行、とあるが、ずいぶん待っても解消しない。PCでのテスト実行では問題なかったところ。

※Windows Socketのエラー一覧:10036番

試行錯誤してみたところ、Mobileでは、Datagram Socketの使い回しを止めて、毎回、再作成するようにすると回避できる。

AnalyticsInfo

ほめられたコーディングではないが、Windows.System.ProfileのAnalyticsInfoから、デバイスの識別情報を取って、条件分岐。

PC:コンストラクタでDatagram Socketを用意して、使い回し
Mobile:コンストラクタではDatagram Socketを用意せず、時刻更新ボタン押下の度、都度作成

UWPとはいっても、若干の挙動の違いは残る様子。これからもいろいろ悩まされそう。

UWP:Mobile画面のepx(有効ピクセル数)2015年08月14日 14:26

UWPでは、レスポンシブデザインということで、様々な大きさの画面を考慮して設計せよ、とあるが、一筋縄ではいかない。

※レスポンシブデザインについて
https://msdn.microsoft.com/ja-jp/library/windows/apps/dn958435.aspx

VisualStudio 2015のMobileエミュレータは、5種。画面の大きさでいうと、WVGA、WXGA、720p、1080pの4種。4~6インチの画面をサポート。それぞれで縦と横、動作確認を行うが、なかなか思い通りにならない。2つのListViewの縦横の並び、広い用と狭い用のTemplateの選択、など。

Page_SizeChangedイベントハンドラ

しびれを切らして、PageのSizeChangedイベントで、縦横の有効ピクセル数をデバッグ出力させてみる。整数値でないものもある。(小数点2位四捨五入)

WVGA:533.3 x 320
WXGA:568.9 x 341.3
720p:640 x 360
1080p:768 x 432
デスクトップの最小:500 x 320

エミュレータの見た目は変わらないが、結構幅がある。Mobileは1種類と考えてはいけない。

VisualStateのStateTriggersの例

ListViewの大きさとこれら有効ピクセル数を考慮し、VisualStateを必要なだけ、StateTriggersで画面の縦横のサイズごとに切り替わるように設定。上図は、WVGAの縦と横の設定例。TargetのPropertyのうち、Grid.Rowなどは、()で囲んで指定する。上段のGridは2行1列、下段は1行2列。