質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

2020閲覧

WPF:スタイル再利用のために、ControlTemplateに追加した要素のプロパティを変更したい

ttact

総合スコア170

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2022/01/21 06:38

編集2022/01/21 06:39

課題

Buttonのスタイルを定義する際、元のButtonにはないカスタム要素を外観に追加しようと思います。そのカスタム要素の色について、適用先のButtonが担当する役割の分類に応じて配色を変更したいと思っています。

「Buttonが担当する役割の分類」とは、数種類しかありません。例えば以下のような感じです:

  • 押下すると、別の画面に遷移する
  • 押下すると、Model側の処理を非メインスレッドで起動する

ここで、画面遷移系のボタンはオレンジ系に、処理実行系のボタンは緑系に、それぞれ配色を割り当てますが、全体的なデザインは配色以外は共通にしたいと思っています。

このようなとき(元々存在するBackgroundみたいなプロパティはBasedOnを使って上書きできると思いますが)スタイルに新しく追加したものはどうやって設定・管理すればいいんでしょうか。

以下のようにスタイルを定義します。

xml

1<Style TargetType="Button" x:Key="MyBtnStyle1"> 2 <Setter Property="Template"> 3 <Setter.Value> 4 <ControlTemplate TargetType="Button"> 5 <Border Name="border" Background="Blue" > 6 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 7 </Border> 8 <ControlTemplate.Triggers> 9 <Trigger Property="IsPressed" Value="True"> 10 <Setter TargetName="border" Property="Background" Value="Aqua" /> 11 </Trigger> 12 </ControlTemplate.Triggers> 13 </ControlTemplate> 14 </Setter.Value> 15 </Setter> 16</Style>

ここでボタンに新しく追加した外観要素であるborderの色は非押下時はBlue、押下時はAquaに設定しています。これを、別のスタイルMyBtnStyle2ではそれぞれRed/Pinkに変更する感じです。

ちなみにこの例では色が少ないのでそれぞれBackgroundをTemplateBindingしたりすれば済みますが、実際のスタイルはもっと多くの要素を持っています。

環境

Visual Studio Professional 2019 ver.16.11.9
.NET 5

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんな感じでどうでしょう?(普段あまりStyle.Resources使わないので穴があったらすいません^^;

xml

1<Window 2 x:Class="Q5vo07sjkii21tp.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="400" 6 Height="200"> 7 <Window.Resources> 8 <Style x:Key="MyBtnStyle1" TargetType="Button"> 9 <Style.Resources> 10 <SolidColorBrush x:Key="Button.Static.Background" Color="Blue" /> 11 <SolidColorBrush x:Key="Button.Static.Foreground" Color="White" /> 12 <SolidColorBrush x:Key="Button.Pressed.Background" Color="Aqua" /> 13 <SolidColorBrush x:Key="Button.Pressed.Foreground" Color="White" /> 14 </Style.Resources> 15 <Setter Property="Foreground" Value="{DynamicResource Button.Static.Foreground}" /> 16 <Setter Property="Margin" Value="5" /> 17 <Setter Property="Padding" Value="5" /> 18 <Setter Property="Template"> 19 <Setter.Value> 20 <ControlTemplate TargetType="Button"> 21 <Border Name="border" Background="{DynamicResource Button.Static.Background}"> 22 <ContentPresenter 23 Margin="{TemplateBinding Padding}" 24 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 25 VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 26 Focusable="False" /> 27 </Border> 28 <ControlTemplate.Triggers> 29 <Trigger Property="IsPressed" Value="True"> 30 <Setter TargetName="border" Property="Background" Value="{DynamicResource Button.Pressed.Background}" /> 31 <Setter Property="Foreground" Value="{DynamicResource Button.Pressed.Foreground}" /> 32 </Trigger> 33 </ControlTemplate.Triggers> 34 </ControlTemplate> 35 </Setter.Value> 36 </Setter> 37 </Style> 38 39 <Style 40 x:Key="MyBtnStyle2" 41 BasedOn="{StaticResource MyBtnStyle1}" 42 TargetType="Button"> 43 <Style.Resources> 44 <SolidColorBrush x:Key="Button.Static.Background" Color="Red" /> 45 <SolidColorBrush x:Key="Button.Static.Foreground" Color="White" /> 46 <SolidColorBrush x:Key="Button.Pressed.Background" Color="Pink" /> 47 <SolidColorBrush x:Key="Button.Pressed.Foreground" Color="Black" /> 48 </Style.Resources> 49 </Style> 50 </Window.Resources> 51 <WrapPanel> 52 <Button Content="MyBtnStyle1" Style="{StaticResource MyBtnStyle1}" /> 53 <Button Content="MyBtnStyle2" Style="{StaticResource MyBtnStyle2}" /> 54 </WrapPanel> 55</Window>

アプリ画像

投稿2022/01/21 13:29

編集2023/07/29 14:34
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttact

2022/01/23 02:37

TN8001様、ご回答ありがとうございます。まさに自分が望んでいた実装でして大変助かりました。DynamicResourceは何に使うのかイマイチよくわかってなかったのですが、このようにも使えるのですね。参考にさせて頂きます。
guest

0

ControlTemplate で設定すべき項目があるのなら、私ならボタンのカスタムコントロールを作って対応します。
カスタムコントロールのDPで BackgroundなりIsPressed時の色を設定してあげれば良いのではないでしょうか。
CustomControl ControlTemplate, WPF で検索すれば色々情報はあると思います。

投稿2022/01/21 08:49

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttact

2022/01/23 02:36

ebiryo様、ご回答ありがとうございます。TN8001さんのご回答内容で所望のことが実現できたことと、カスタムコントロールを作る場合には適用先でボタンに対してさらなるカスタマイズを施したい時などに(プロパティの転送実装などで)カスタムコントロール自体の修正が必要になる点などから、申し訳ありませんがベストアンサーからは外させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問