ideaki's blog

WinRT C#/XAML の開発について

Windows 10 で家電を操作する!Nature Remo for UWP アプリを作りました

www.microsoft.com

概要

Nature RemoのAPIを使用したWindows 10 向けのNature Remo for UWP アプリをつくりました。
Micorosoft Storeで公開中です。
Windows10、Xbox One、HoloLensで使用できます。(Fall Creators Update以降必須)


Nature Remo for UWP アプリでできること

  1. シグナルの送信
  2. エアコンの操作
  3. シグナルをスタートメニューピン留め

f:id:ideaki:20180612003340p:plain:w200 f:id:ideaki:20180612003337p:plain:w200 f:id:ideaki:20180612003334p:plain:w200
できることは公式のiOS/Androidアプリに比べるととっても少ないですが、家電の操作に必要な機能は抑えてあります。


Nature APIを眺めるとまだまだいろいろできそう

  • 家電の登録
  • 家電の編集
  • シグナルの登録
  • シグナルの編集
  • シグナルの並び替え

家電やシグナルの登録編集は公式から行う方がいいでしょうけど


技術的なことを少し

  • C#/XAMLで作成しました。
  • 家電やシグナルのアイコンはすべてWindowsの標準フォントを使用しました(Segoe MDL2 AssetsとSegoe UI Symbol)
  • Nature RemoのAPIはSwaggerで定義されているのでクライアントコードは自動生成しました。
  • 自動生成されたクライアントコードは.NETStandard2.0が必須だっためFall Creators Update以降をサポート対象としました。
  • FCUの皮をかぶったWindows 10 Mobileは知らない子です。

過去に買ってきたWindowsモバイルたち

この記事は、Windows 10 Mobile Advent Calendar 2017 の 7 日目の記事です
adventar.org

Windows8が登場したころ、僕はまだWindowsにモバイル端末があることをしりませんでした。
ストアアプリの開発をはじめてからめとべや勉強会を知り、
変態的な愛され方をするWindowsPhoneなるものを見てから興味をもったのが購入のきっかけだったと思います。

Lumia520

f:id:ideaki:20171207011539j:plain
初めてのWindowsモバイル、中身はWindow Phone 8
おもちゃとして購入
社会人を始めて間もないころ通勤バスに揺られながらフラッピーバードや2048で暇をつぶしていたものです。
手に持った時のフィット感と手触りが最高でした。

Lumia636

f:id:ideaki:20171207012436j:plain
UWP版Sankaの開発で非常にお世話になっている端末
購入当初はWindowsPhone8だった気がしましたが
Windows 10 Mobile 登場時に早々とアップデートすることができ、
SankaをMobileのAU、CUにそれなりに対応できたのはこの子のおかげだったとおもいます。
Mobile上では重くてまともに動かなかったSankaを少しはまともに動かせるようにするのにも大変お世話になりました。
解像度が低いおかげなのか意外とサクサク動いてくれる。

Madosma Q501

f:id:ideaki:20171207012641j:plain開封時に撮った写真
f:id:ideaki:20171207012910j:plain
数種の国産WindowsPhoneが登場しようという中、めとべやでひらいさんから開発秘話を聞き、絶対に買うと決めていた端末。
初めて手に持った時の軽さは今後も忘れることはないでしょう。
WinRT版SankaをWindowsPhone移植するのにお世話になりました。
(結局完成しませんでしたが。)

Madosma Q601

f:id:ideaki:20171207013848j:plain開封時に撮った写真
f:id:ideaki:20171207013726j:plain
高い解像度をもち、アプリの表示をタブレットサイズにできる優秀な子。
メイン端末化を試みましたが、LINEアプリのグループ向け機能がことごとく使えずやむなくiPhoneに戻った記憶があります。
本体が悪いわけではなかっただけに非常に残念でした。
今もPCにはつなぎっぱにして開発用としてお世話になっています。

以上の4点が過去に買ってきたWindowsモバイルたちでした!
明日は@CryEarth_Sasakiさんです!

UWP SwipeableSplitViewを作ってみた

SwipeableSplitViewぐぐるとよさそうなのがでてくるけどもいかんせん転用しづらいため勉強のため車輪してみた。

作ってみた後にこっちのほうがはるかに使い道が限られているなと思った。(DisplayModeがCompactOverlayじゃないとまともに動かない)
興味あるかた向けにすぐ動くソースを置いておきます。

https://1drv.ms/u/s!AhaSq7vQuLAcidkSnYZ7c4VzJq17ZQ

その他所感

  • Styleはほとんどいじらず済んだ(2か所コメントアウト、2か所にManipulatonModeを追加、PaneClipRectangleTransform.TranslateXにBindingを追加)
  • Manipulation周りは正直もうさわりたくない
  • Style内のTemplateで双方向Bindingはできる

UWP UISettingsを使用する場合の注意点

投稿時点(2017/01/08)の投稿者のWindows 10 SDKの最新バージョンは14393になります。
この記事はUWPデスクトップアプリ向けです。

UISettingsを使用することで、アクセントカラーの取得や変更通知の受け取りができます。

// using Windows.UI.ViewManagement;
// sender is UISettings
new UISettings().ColorValuesChanged += (sender, e) => Debug.WriteLine(sender.GetColorValue(UIColorType.Accent));

使用する場合はいくつかの注意点があります。

  1. ColorValuesChanged 通知が2度続けてやってくる(500ms前後の間あり)
  2. ColorValuesChanged 通知直後にGetColorValue()すると値が正しくない(1~2秒待機する必要がある)
  3. リリースビルドではUISettingsをAppクラス外でインスタンス化するとコードの実行がスキップされる(?!)

3.の対処は簡単ですAppコンストラクタでUISettingsをインスタンス化してどこかに保持しておけばいいです。
 デバッグビルドではどこでUISettingsをインスタンス化しても問題ない、なぜなのか...
1.も2.もRxを使えばたいしたことないのですが、なぜかリリースビルドでは下記のコードがエラーとなってしまいます。
 #Rxの達人でもなければ今回の対処のために初めて実用したレベルなのであきらめ...

Observable.FromEventPattern(UISettings, "ColorValuesChanged")
    .Throttle(TimeSpan.FromMilliseconds(2000))
    .ObserveOn(SynchronizationContext.Current)
    .Subscribe( _ =>
    {
        // hoge
    });
// ↓リリースビルド実行結果↓
// 例外がスローされました: 'System.InvalidOperationException' (System.Reactive.Linq.dll の中)
// 型 'System.InvalidOperationException' の例外が System.Reactive.Linq.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした
// 追加情報:Could not find event 'ColorValuesChanged' on object of type 'Windows.UI.ViewManagement.UISettings'.

手っ取り早くアクセントカラーの変更監視と取得を行うにはUISettingsしかありません。
できれば使いたくない代物ですが頑張って使うしかないです。

UWP ライブラリを追加したらまずリリースビルドをしましょう

タイトルがすべてです。


※ 以下、2016/05/09時点のお話しです。

たまのリリースビルドで EntityFramework.SqliteのDbContextからエラーが発生

原因はWinRTXamlToolkit.UWPをプロジェクトが参照していたから。
アンインストールすることでエラーは出なくなりました。
もともとコンバータを少し使っていただけなので原因の究明はしない...

UWP EntityFramework SQLite DBファイルをデフォルト以外に保存する

ドキュメントによるとデフォルトは下記

ApplicationData.Current.LocalFolder.Path

デフォルト以外に保存する場合は

public class FooBarContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<Bar> Bars { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionString = System.IO.Path.Combine($"Data Source={Windows.Storage.ApplicationData.Current.RoamingFolder.Path}", "FooBar.db");
        optionsBuilder.UseSqlite(connectionString);
    }
}