Windowsストアアプリでの物理キーボードの有無

物理キーボードの有無を確認することで、「キーボード操作」とタブレットでの「コントローラーUI操作」の表示切替を実装することができる。

「KeyboardCapabilities Class」を使用して確認
「KeyboardPresent」が読み取り専用であるので、これを確認すること。

下記のページで確認したもの
http://msdn.microsoft.com/ja-jp/library/windows/apps/windows.devices.input.keyboardcapabilities.aspx

Windowsストアアプリで使用できるグラフコントロール

Modern UI (Metro) Charts for Windows 8, WPF, Silverlight
License:Microsoft Public License (Ms-PL)

・これから調べる

WinRT XAML Toolkit
License:The MIT License (MIT)
上記のチャートは「Windows 8 Toolkit – Charts and More(License:Common Development and Distribution License (CDDL))」からのポート
・これから調べる
・WinRT XAML ToolkitはどうやらWin8.1ベースでVS2013になっている模様

どちらもベータで、「Modern UI (Metro) Charts for Windows 8, WPF, Silverlight」には折れ線グラフはまだない

有料であれば、下記のようなものもあります。
NetAdvantage for Windows UI

デスクトップでWindowsRuntimeAPIを使う場合の忘備録

MSエヴァンジェリストのVS魂100連発から
http://www.youtube.com/watch?v=xmwTbfWKDyA

・最初の設定
デスクトップアプリのプロジェクトをいったん「プロジェクトのアンロード」を行う
アンロードしたプロジェクトを右クリックして「.csprojの編集」をクリック
「PropertyGroup」内に「TargetPlatformVersion」を追加して「8.0」とする
上書き保存したらプロジェクトを再読み込みする
「参照設定」から「参照の追加」をクリックすると左側に「Windows」が増えているのでコアから「Windows」を追加
「ブラウズ」から「参照」で「\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5」から「System.Runtime.dll」を追加する。
「using Windows.Foundation;」を追加する。
「System.Runtime.dll」は.NETのCollectionとRTのCollectionに互換性がないため、その互換変換のために必要になる。

・async/awaitの非同期に対応する
「参照設定」から「参照の追加」をクリック
「ブラウズ」から「参照」で「\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5」から「System.Runtime.WindowsRuntime.dll」「System.Threading.Tasks.dll」の二つを追加
これを追加することで「async/await」が使用可能になる。
使わない場合「IAsyncOperation」をもとに書くようにする。

今更ながらの忘備録、これでストアアプリ管理ツールの作成などにもWindowsRuntimeAPIを使える。

indexを指定可能なIntデータCollectionProperty

collectionなPropertyにIndexを指定して通知したい場合に下記のように行う
通常ではIndex指定でやり取りはできないと思うのでメモがてら

    /// <summary>
    /// IntデータcollectionProperty
    /// </summary>
    public class CollectionDataProperty : CryEarth.lib.cryearthlib.NotifyPropertyChangedMethod
    { 
        private readonly Collection<int> items = new Collection<int>();

        public CollectionDataProperty()
        {
            items.Clear();
        }

        public int this[int index]
        {
            get
            {
                // indexの境界チェック
                if (items.Count < index)
                {
                    return 0;
                }
                return items[index];
            }
            set
            {
                //indexの境界チェック
                if (items.Count < index+1)
                {
                    items.Add(value);
                }
                else if (items[index] == value)
                {
                    return;
                }
                else
                {
                    items[index] = value;
                }
                OnPropertyChanged(ITEMS);
            }
        }

        private const string ITEMS = "Item[]";
    }

デバッグ用のメモ

TDDを徹底すればこれはあまり必要ないかもしれないが、あって困るものではないので、メモ代わりに書いておく
公式サンプルなどから集めたものなので、あまりきれいではない。
機能を追加するとすれば、ローカルストレージ(またはSQL)への保存機能を追加することで、追いかけやすくなるのではないかと思われる。

using System.Runtime.CompilerServices;
public static class DebugLoging
{
// WinRTコアイベントのDispatcher
// 使用する際は「Window.Current.Dispatcher;」を渡すこと
// debug情報ページをInFreamに読み込んでいる
public static CoreDispatcher coreDispatcher;
// 書き出しに使用するTextBlock
public static TextBlock debugOutputTextBlock;

// Cでのマクロ、__LINE__ , __FILE__ や
// C#(WindowsPhone)でのStackFram は使用できないので、
// C#5.0の「System.Runtime.CompilerServices」を使用する
public static async void DebugPrint(string msg,
[CallerFilePath] string file = "",
[CallerLineNumber] int line = 0,
[CallerMemberName] string member = "")
{
var fullMessage = string.Format("{0}:{1}\r\n\t{2}: {3}", file, line, member, msg);

Debug.WriteLine(fullMessage);

if (coreDispatcher != null)
{
await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
debugOutputTextBlock.Text =
debugOutputTextBlock.Text +
DateTime.Now.ToString(@"M/d/yyyy hh:mm:ss tt") + " " + fullMessage + "\r\n";
});
}
}
}

PageのFrame読み込みに関するメモ

PageをNavigationでそれぞれ個別ページ遷移呼び出しではなくFrameを宣言して、その中に読み込むことができる。
所謂HTMLでいうところの「iframe」のような形が可能

・元PageでのXAML宣言

<Frame x:name="otherPageFrame" />

・元ページでの呼び出し

otherPageFrame.Navigate(typeof(OtherPage), this);

PageをFrameとして入れ込んでいるため、各ページでコードを管理できるが、呼び出し順(Loadedイベントで特に)などで問題が起きやすいものと思われる
UIコントロールが有効になっていない時に読み込むことはできないので、当たり前とは思われる。
・直接LoadedイベントをXAMLに宣言せず、「InitializeComponent()」の後、または「OnNavigatedTo」でイベントを有効化する
・「OnNavigatedFrom」でイベントを解除するのを忘れないこと

//まだまとまっていないので、掘り下げること

Windows Media エンコーダーをWindows8で使用する

64Bit版ではありますが、この版をWindows8 64bit版で使用可能なようです。

Windows Media Encoder 9 Series x64 Edition
http://www.microsoft.com/ja-jp/download/details.aspx?id=1786

Windows8 32Bit版は非対応ですので、現状では使用できないようです。

Windows ストアアプリ開発の情報

@shinoblogavi さんのツイートで、Windows ストアアプリの画面設計に使えそうなものを教えてもらえました。

VS2012 Ultimate、Visual Studio Premium、または Visual Studio の Test Professionalをインストールしている場合、PowerPoint のストーリーボード図形にUIデザインできるストーリーボード図形が同梱されている。
Windows8、WindowsPhone、iPhoneなどがありました。

Windows ストア アプリの PSD 設計資産のダウンロード
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh700403.aspx

高橋 忍のブログ
UX & モバイル、全ては心でエバンジェリズム♪
Windows 8 UIデザインシート
http://blogs.msdn.com/b/shintak/archive/2013/04/15/10411038.aspx

Windows Phone UI デザインシート
http://blogs.msdn.com/b/shintak/archive/2013/04/15/10411097.aspx

プライバシーポリシー/Privacy policy

# アプリケーションのプライバシーポリシー
このアプリケーションは、個人情報を収集したり公開しません。

このアプリケーションではURLを開く行為を許可しています。開かれたURLはインターネットブラウザによって保存される可能性があります。

ブラウザによる情報の保存に関しては、お使いのブラウザのプライバシーポリシーを参照してください。

広告に関しては、広告先のプライバシーポリシーをご覧ください。

————————————————————————–

# Application privacy policy
This application does not collect or publish any personal information.

The app allows you to open web URLs from the application. The URLs might be saved by internet browsers on your device.

For information regarding the information stored by these application, please read the privacy policy of the internet browsers on your device.

When it comes to advertising, please see the privacy policy to which the ad.