dragan10

The Silverlight Geek - テーマについて再び:ImplicitStyleManager

2008-12-24 02:17:32

コントロールツールキットに含まれる新しいテーマの利用についての最近のポストでは、Xamlへのテーマの追加と、そのテーマが適用されるコンテナの追加についてお見せしました。

これに変わる強力な代案がImplicitStyleManagerの利用で、このやり方では一つ一つのコントロールにテーマを適用したり、さらに一般的なやり方としては、コンテナ(例えばGrid)とその中のすべてのコントロールにテーマを適用したりできます。

それには、テーマを定義している.xamlファイルにSilverlight URIを渡してやります。Silverlight URIは、ツールキットと一緒に提供されているソースコードから直接プロジェクトにコピーしてやることができます。

いただいた質問のおかげで、よりはっきりした情報を提供しておくべきだったことに気づきました:

このxamlファイルを追加するための正確な段階は次の通りです。ツールキットのソースファイルに行き、Themes疑似フォルダを探し、Controls.Theming.ShinyBlueの下のThemes.xamlをあなたのプロジェクトにコピーし、その名前をMicrosoft.Windows.Controls.Theming.ShinyBlue.xaml (図にあるとおり)にします。

この名前は、コピーしたファイルがControls.Theming.ShinyBlueプロジェクトから取ってきたものだからで、Controlsはファイル中に次のように書かれています:

xmlns:controls="clr-namespace:Microsoft.Windows.Controls; assembly=Microsoft.Windows.Controls"

これでページ作成の準備ができたので、BlendやVisual Studioでレイアウトすることができます。

右上にあるApply Themeをクリックすると、コントロールツールキットの一部として提供されているテーマを適用することができます。すでに、ShinyBlueテーマを定義している.xamlファイルは追加してあるので、追加しなければならないのはテーマサポートのDLLへの参照だけです。

そして、Page.xaml.csの先頭のusing文で、ImplicitStyleManagerを参照できるようにします。

using Microsoft.Windows.Controls.Theming;

そうしたら、Apply Themeボタンのクリックに反応するためのイベントハンドラを書きます。

void applyTheme_Click( object sender, RoutedEventArgs e )

{

このメソッド中では、さきほどのxamlファイルを指すSilverlight URIを生成します。URIのコンストラクタはShinyBlue.xamlを指すSilverlight pathと、列挙型の定数であるUriKind.Relativeを引数として取ります。これで、ImplicitStateManagerの三つのスタティックなメソッドを呼ぶ準備ができました。

1. SetResourceDictionaryURIは、テーマを適用したいコントロール(今回はLayout Rootで、全コントロールにテーマが適用されることになります)と、テーマのURIを引数として取ります。

2. SetApplyModeも適用したいテーマを引数に取りますが、二番目の引数はImplicitStyleApplyMode のいずれかの定数です(Auto, OneTime, Noneのいずれかです)。.

3. Applyはスタイルを適用するためのもので、唯一の引数としてスタイルを適用するコントロールを取ります。

Page.xaml.csの完全なコードは以下の通りで、たったいま説明したコードも含まれています。

using System;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Windows.Controls.Theming;

namespace ThemesWithISM
{
   public partial class Page : UserControl
   {
      public Page()
      {
         InitializeComponent();
         Loaded += new RoutedEventHandler( Page_Loaded );
      }

      void Page_Loaded( object sender, RoutedEventArgs e )
      {
         applyTheme.Click += new RoutedEventHandler( applyTheme_Click );
      }

      void applyTheme_Click( object sender, RoutedEventArgs e )
      {
         Uri uri = new Uri( @"ThemesWithISM;component/Microsoft.Windows.Controls.Theming.ShinyBlue.xaml", UriKind.Relative );
         ImplicitStyleManager.SetResourceDictionaryUri( LayoutRoot, uri );
         ImplicitStyleManager.SetApplyMode( LayoutRoot, ImplicitStylesApplyMode.Auto );
         ImplicitStyleManager.Apply( LayoutRoot );
      }
   }
}

スタイルの適用

最初にページが表示されたときには、スタイルがありません。

Apply THemeボタンをクリックすると、イベントハンドラImplicitStyleManagerのメソッドを呼び出して、テーマを適用してくれます。

 

(原文はこちら

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ