Blog


コントロールのテンプレートを変更する

Styleプロパティではコントロールのプロパティで指定できる範囲でしか見た目を変更できません。

プロパティを超えた範囲でコントロールの見た目を変更するにはTemplateプロパティを変更します。

Templateプロパティ内にControlTemplateを配置し、その中にコントロールの見た目を記述することで外観を大きく変更したコントロールを作成できます。

また、リソースを使うと複数のボタンにTemplateを適用できます。

TemplateBinding

Template内の要素に対し、Templateの適用先のコントロールから値を設定するにはTemplateBindingを使います。

Text以外にも複雑なContentを指定する場合はContentPresenterを使います。

 




コントロールのスタイルを設定する

コントロール1つ1つのプロパティをリソースにして共通化させていてはかなり苦労が必要になります。

同一のコントロールはこの色、幅にしたいなど、複数のプロパティを一括でリソース化する必要があります。

XAMLではそのような複数のプロパティを一括でリソースとして宣言するために、Styleという型があります。

StyleはこのようにResource内で定義し、TargetTypeで適用するコントロールを指定します。

さらにSetterを用いてプロパティの値を指定します。

使うときはコントロールのStyleプロパティにStaticResourceでリンクさせることで複数のコントロールの外観を一括で変更できます。

また、Styleプロパティは優先度が低く、他のプロパティに同一の値が設定された場合、プロパティを直接指定したほうが優先されます。

ですのでこのように共通化しない部分だけプロパティで指定してやることで同じような外観で必要な部分だけ変更できます。

 




リソースを共通化する

XAMLリソース

XAMLによって記述されたコントロールやFrameworkElementはそのプロパティを変更することによってデザインや挙動を変更することができます。

プロパティに指定した値を複数のコントロール間で共有するためにはその値をリソースとして別の場所に定義し、複数のコントロールからそのリソースを参照することで共通化を行うことができます。

XAMLリソースには以下の2種類のリソースタイプがあります。

  • StaticResource
  • ThemeResource

StaticResourceはその名の通り静的で、アプリの実行時のリソースは常に固定されます。

それに対しThemeResourceはアプリの実行時のシステムテーマによって使用するリソースが動的に変化します。

StaticResource

現在の要素から見える範囲にあるリソースに対し、キーを指定してリソースを参照します。

例えば以下のようにPageのリソース内にbuttonContentというキーのstringリソースを配置し、buttonコントロールからはContentプロパティにStaticResourceで参照させています。

このようにすることで複数のボタンコントロールに対し、共通の文字列でContentプロパティを指定できます。

リソースの型は、StringやDoubleなど、基本的なプリミティブ型以外にもコントロールのプロパティに指定できる型ならリソースとして宣言可能です。

特にSolidColorBrush型はコントロールの色ブラシを定義するため、リソースとしてよく宣言します。

リソースの宣言箇所

XAMLリソースは親要素またはApp.xamlのResourceプロパティに記載されたリソースでなければ参照することができません。

例えばこのようにGridのResourceプロパティに記載したbuttonWidthリソースは範囲外であるPageのWidthプロパティからは参照できず、Grid内でしか参照できません

ですので通常は、共通のリソースを参照したい単位でリソース化します。

アプリ全体に共通化させたい場合はApp.xamlのResourceプロパティに

Pageで共通化させたい場合はPageのResourceプロパティに書きます。

リソースを外部ファイル化する

XAMLではリソースを書き込む外部ファイルのことをリソースディクショナリと言います。

VisualStudioでは新しい項目からリソースディクショナリを作成できます。

TestDictionary.xamlではtestResource1とtestResource2を宣言しておきます。

使用するときはResourceプロパティ内のResourceDictionaryタグのSourceプロパティにリソースディクショナリのパスを指定します。

今回はAssetsフォルダにTestDictionary.xamlを入れています。

通常はリソースディクショナリは1つだけではなく、複数のリソースディクショナリを組み合わせます。

複数のリソースディクショナリを使う場合はResourceDictionaryのMergedDictionariesに指定する必要があります。

ThemeResource

StaticResourceとは違い、ThemeResourceはアプリケーションが起動した時のApp.RequestedThemeによって使用するリソースが決定されます。

ThemeResourceを宣言する場合はResourceDictionaryの

ThemeDictionariesの中にResourceDictionaryを複数書きます。

そのkeyによってthemeが決定しますがUWPではDefault、Light、Darkの3つのテーマが存在します。

使用するときは{ThemeResource resourceKey}とすることで使用できます。

テーマを指定する方法ですが、App.xamlにRequestedThemeとして指定されています。

RequestedThemeに何も指定がない場合はDefaultが選択されます。

3つもテーマを指定しているとResourceの記述が長くなるため、通常はこのように外部ファイルにResourceDictionaryとして書き出し、そのファイルを読み込んで参照します。

システム規定のThemeResource

よく使うコントロールは、システムがテーマに対する規定のリソースを用意しています。

そのリソースディクショナリはこのパスにあるgeneric.xamlです。

このリソースディクショナリに書いてあるキーをアプリ内のファイルから再定義することでコントロールの規定のthemeリソースを編集できます。 Take the higher ground and stay out of it www.cellspyapps.org




DreamSparkアカウントでAzureMachineLearningを無料で使う方法

Azure MLはMicrosoftアカウントに紐付いたAzureサブスクリプションに対し、1つ10GBのフリーワークスペースを割り当ててくれます。

このフリーワークスペースにさえアクセスできればDreamSparkアカウントでもAzure MLを10GB無料で使えます。

※この方法は2016/2/23時点でAzureMLがFreeワークスペースを提供してくれている情報です。今後どうなるかはわかりません

やり方としては、まずAzure ポータルにアクセスします。

DreamSparkでサインインし、ポータルが使えればOKです

その後、https://studio.azureml.netにアクセスします。

すると、「Get Started」というボタンが中央に表示されますのでクリックします。

すると以下のようなダイアログが表示されるのでSign inを押します。

すると普通に10GBのフリーワークスペースを割り当てられ、Azure MLを利用できます。

ちなみに私のフリーワークスペースですがこれだけ実験シートを作っても2GBなので結構遊べると思います。

ポイント

DreamSparkのポータルではそもそもAzureMLのMLStudioにアクセスできませんがURLに直接アクセスするとちゃんとフリーのワークスペースを割り当ててくれます。




MVP Community Camp 2016名古屋会場で登壇してきました

2016/2/20にMVP Community Camp2016名古屋会場でAzure Machine Learningについて登壇してきました

スライドはこちらです。

Azure MLとなると、どうしても機械学習の話から入らなければいけなかったので、最後のセッションに機械学習の話をするのは参加者的にも負担が大きかったと思います。

最終的に2つのデモを行い、2つとも成功したので良かったと思います。

反省点

  • プロジェクターにつなぐと解像度的にデモをしにくかった
  • 時間がなくなってしまってデモを高速に終わらせてしまった
  • 機械学習をうまく伝えれなかった(そもそも理解が甘い)

話せなかったところ(理解してなかったところ)

  • MLのPython、R連携
  • MLのNoteBook
  • MLのBathExecution
  • 統計データの表示

名古屋のComCampは初めてでしたが内容も濃くて非常に有益な時間だったと思います。