プロフィール

髭山髭人(ひげひと)

自分の書いた記事が、一人でも誰かの役に立てば...
活動信条の一つとして「貴方のメモは、誰かのヒント」というのがあります。

このサイトについて

本家HP packetroom.net から切り離した いわゆる技術メモ用のブログで、無料レンタルサーバーにて運用しています。広告表示はその義務なのでご容赦。
XREA さんには長年お世話になっています

C# WPF / Style を使ったコードビハインド側でのデザイン動的変更

普段よくやるやつ

プロパティ代入による変更。
多分一般的

MenuItem _menuItem = new MenuItem();
_menuItem.Header = "ほげ";
_menuItem.FontSize = 12;
_menuItem.Height = 16;
_menuItem.Margin = new Thickness(0);
_menuItem.Padding = new Thickness(0);
_menuItem.InputGestureText = null;
_menuItem.Foreground = System.Windows.Media.Brushes.Blue;
_menuItem.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;

↓ こっちはオブジェクト初期化子を使った書き方

MenuItem _newMenuItem = new MenuItem()
{
    Header = "ほげ",
    FontSize = 12,
    Height = 16,
    Margin = new Thickness(0),
    Padding = new Thickness(0),
    InputGestureText = null,
    Foreground = System.Windows.Media.Brushes.Blue,
    HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch
};

new MenuItem() の かっこ () も省略できるんだけど、個人的には無いとちょっと落ち着かない…

system.windows.style 適用による変更

本題

Microsoft Learn - コントロールのスタイルを作成する方法 (WPF .NET)

先ほどのプロパティ代入とは別に、以下も選択肢の一つになりえるかなーと。

xaml 側でリソースとして用意しておくムーブと似たような感じで、
「一度作った Style をコードビハインド上で使いまわす」みたいな応用とか?

MenuItem _menuItem = new MenuItem()
{
    Header = "ほげ"
    /**
    * ↑ のように、ここで書くのもアリだけど
    * Style 側で、以下のように後付け割り当ても可
    * style.Setters.Add(new Setter(MenuItem.HeaderProperty, "ほげ"));
    */
};

Style style = new Style(typeof(MenuItem));

// ※ 12 や 16 のような int 表記だと例外吐かれました 💦
style.Setters.Add(new Setter(MenuItem.FontSizeProperty, 12.0));
style.Setters.Add(new Setter(MenuItem.HeightProperty, 16.0));
style.Setters.Add(new Setter(MenuItem.MarginProperty, new Thickness(0)));
style.Setters.Add(new Setter(MenuItem.PaddingProperty, new Thickness(0)));
style.Setters.Add(new Setter(MenuItem.InputGestureTextProperty, null));
style.Setters.Add(new Setter(MenuItem.ForegroundProperty, System.Windows.Media.Brushes.Blue));
style.Setters.Add(new Setter(MenuItem.HorizontalAlignmentProperty, System.Windows.HorizontalAlignment.Stretch));

// 割り当て
_menuItem.Style = style;

Microsoft Learn - Menu の ControlTemplate