.NET TIPS

WPFアプリケーションの外観をWPFテーマで動的に変更するには?

デジタルアドバンテージ 一色 政彦
2011/07/04

 「.NET TIPS:WPFテーマで外観を簡単に変更するには?(基本編)」では、基本的なコントロールの見た目を一括変更できる「WPFテーマ(WPF Themes)」の使い方を説明した。そのTIPSのサンプルでは、外観を静的に定義することで、WPFアプリケーションの起動時に、WPFテーマが自動的に適用されるように実装した。

 そのように静的に外観を変更する以外にも、エンド・ユーザーが外観の値を指定したタイミングなど、動的に外観を変更することも可能だ。本稿では、プログラム・コードにより動的にWPFテーマを適用する方法を説明する。

■WPFテーマの動的な適用方法

 それでは、実際にWPFアプリケーションにWPFテーマを適用してみよう。本稿では、開発環境としてVisual Studio 2010を用いる。事前に、「.NET TIPS:WPFテーマで外観を簡単に変更するには?(基本編)」の「WPFテーマの準備」の項まで作業を行い、WPFテーマを使う準備を整えておく。

●アプリケーションにWPFテーマを適用する方法(リソース・ディクショナリ)

 それでは、WPFアプリケーションのコンボボックスの選択値が切り替えられたときに、WPFテーマが適用されるように実装しよう。

 まず、エンド・ユーザーがWPFテーマを選択するためのコンボボックスを用意する。本稿の例では、次の画面のようなコンボボックスを作成した。作成方法は、本TIPSの本質ではないので割愛する。

WPFテーマ(の名前)が選択できるコンボボックスの例

 このコンボボックスの選択が切り替わったときに発行されるSelectionChangedイベントのイベント・ハンドラで、WPFテーマを切り替えればよい。

 その切り替え処理自体は、アプリケーション全体を管理するAppクラスに実装することにしよう。具体的には、App.xaml.cs/App.xaml.vbファイルに、引数としてテーマ名を受け取るChangeThemeメソッドを以下のように記述する。

using System;
using System.Windows;

namespace WpfApplication1
{
  public partial class App : Application
  {
    private ResourceDictionary dict;

    public void ChangeTheme(string themeName)
    {
      if (dict == null)
      {
        // 新しいリソース・ディクショナリを追加
        dict = new ResourceDictionary();
        Application.Current.Resources.MergedDictionaries.Add(dict);
      }

      // WPFテーマをリソース・ディクショナリのソースに指定
      string themeUri = String.Format(
        "pack://application:,,,/Themes/{0}.xaml", themeName);
      dict.Source = new Uri(themeUri);
    }
  }
}
Class Application

  Private dict As ResourceDictionary

  Public Sub ChangeTheme(ByVal themeName As String)

    If dict Is Nothing Then
      ' 新しいリソース・ディクショナリを追加
      dict = New ResourceDictionary()
      Application.Current.Resources.MergedDictionaries.Add(dict)
    End If

    ' WPFテーマをリソース・ディクショナリのソースに指定
    Dim themeUri = String.Format(
        "pack://application:,,,/Themes/{0}.xaml", themeName)
    dict.Source = New Uri(themeUri)

  End Sub

End Class
WPFテーマを切り替えるサンプル・コード(上:App.xaml.cs、下:App.xaml.vb)

 このChangeThemeメソッドを呼び出す、コンボボックスのSelectionChangedイベント・ハンドラのコードは、例えば次のようになる。

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  ComboBoxItem item = (ComboBoxItem)comboBox1.SelectedItem;
  if (item == null) return;
  string themeName = item.Content.ToString().Replace(" ", "");
  // ChangeThemeメソッドを呼び出す
  ((App)Application.Current).ChangeTheme(themeName);
}
Private Sub comboBox1_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)

  Dim item = CType(comboBox1.SelectedItem, ComboBoxItem)
  If item Is Nothing Then
    Return
  End If
  Dim themeName = item.Content.ToString().Replace(" ", "")
  ' ChangeThemeメソッドを呼び出す
  CType(Application.Current, Application).ChangeTheme(themeName)

End Sub
ChangeThemeメソッドを呼び出すサンプル・コード(上:App.xaml.cs、下:App.xaml.vb)

 上記のコードをビルドして実行すると、次の画面のようになる。

WPFアプリケーションにWPFテーマを適用するサンプルの実行例

 このように、WPFアプリケーションのコントロールの外観は、WPFテーマを用いることで簡単にカスタマイズできる。End of Article

利用可能バージョン:.NET Framework 3.0以降
カテゴリ:WPF/XAML 処理対象:アプリケーション
使用キーワード:<ResourceDictionary>タグ

この記事と関連性の高い別の.NET TIPS
WPFテーマで外観・デザインを簡単に変更するには?(基本編)
[ASP.NET MVC]ASP.NET MVCデザイン・ギャラリを利用するには?
[ASP.NET]テーマ機能でサイト全体のデザインを一括変更するには?
WindowsフォームでWPFコントロールを利用するには?
Visual Studioでエディタやウィンドウなどの配色を変更するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間