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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

Q&A

解決済

3回答

10332閲覧

【C#】【WPF】【XAML】画像をボタンのプロパティ値によって効率的に切り替える方法を知りたい

galmacher

総合スコア37

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

0グッド

0クリップ

投稿2019/02/06 11:39

ボタンコントロールの中に画像を配置しており、
ボタンのプロパティに応じて画像ファイルを切り替えたいと思っております。
一旦下記のようにして実現することができました。

xaml

1<Button x:Name="button1"> 2 <Image> 3 <Image.Style> 4 <Style TargetType="{x:Type Image}"> 5 <Style.Triggers> 6 <DataTrigger Binding="{Binding IsMouseOver, ElementName=button1}" Value="True"> 7 <Setter Property="Source" Value="C:\1.png" /> 8 </DataTrigger> 9 <DataTrigger Binding="{Binding IsMouseOver, ElementName=button1}" Value="False"> 10 <Setter Property="Source" Value="C:\2.jpg" /> 11 </DataTrigger> 12 </Style.Triggers> 13 </Style> 14 </Image.Style> 15 </Image> 16</Button>

しかし、ボタンの数が多いため、ボタンごとにこのように指定していると行数がかさんで見にくいです。
また、上記例ではIsMouseOverだけですが、実際はIsEnabled等、他のプロパティによって別の画像に切り替える必要があります。
ボタン2には3.jpgと4.jpg、ボタン3には5.jpg、6.jpg…という風にボタンごとに使用する画像も違います。

以下2点、教えていただきたいです。
・同じような記述を省略できるような効率的な記述方法はあるか。
・そもそもDataTriggerで切り替える方法以外にいい方法があるか。

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

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

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

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

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

guest

回答3

0

方法は色々あると思いますが、私だったらカスタムコントロールで対応します。

WPF : Re-usable template for image buttons?
Why does a custom control “ImageButton” not display it's image?

wpf image button custom control とかで検索すれば他にも色々あると思ます。

投稿2019/02/06 23:20

ebiryo

総合スコア797

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

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

galmacher

2019/02/07 04:06

ご回答ありがとうございます。 URL参照させていただきます。
guest

0

ベストアンサー

添付プロパティと添付ビヘイビアを解説してみる

ボタンには XAML でデフォルトの画像を指定しておきます。
そしてホバー中だけ画像を切り替える添付ビヘイビアを作り、添付プロパティでその画像を指定するのがスマートだと思います。

投稿2019/02/06 23:44

Zuishin

総合スコア28660

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

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

galmacher

2019/02/07 04:10

ご回答ありがとうございます。 「ホバー中だけ画像を切り替える添付ビヘイビアを作り」という部分について、添付ビヘイビアの理解が浅く、的外れな質問かもしれませんが、 添付ビヘイビアは添付プロパティとセット(添付プロパティの値が変わったときに添付ビヘイビアが何かしらの処理をする)という理解です。 IsMouseOverやIsEnabledなどのようにButton標準のプロパティ(添付プロパティでないプロパティ)に対して、添付プロパティを定義できるのでしょうか。
Zuishin

2019/02/07 04:14 編集

リンク先に書いてあるように、添付プロパティの値が変わった時(初期化された時)に別のイベントのイベントハンドラを登録する処理を入れればいいと思います。 > さらに変更コールバック関数内でイベント登録することによってイベントに対する挙動を設定できるのでよりビヘイビアっぽくなります。
mikupedia

2019/02/08 02:10

横から失礼します。 まずは単純にマウスオーバー時のときなどそれぞれ状態別に添付プロパティを作ってButton側でパスを設定できるようにしておいてimageのSourceでButtonに設定された添付プロパティをバインドさせておくだけでよいのではないでしょうか?
galmacher

2019/02/10 02:57

Zuishinさん、mikupediaさん ありがとうございます。 それっぽいものを作ることができました。
guest

0

1.リソースを使う
http://www.atmarkit.co.jp/ait/articles/1009/07/news096.html
2.ユーザコントロールを作る
https://qiita.com/soi/items/12ceea4efcf31c1a7b93

あと、大量に配置するなら、データバンディングで作るといいよ。

投稿2019/02/06 16:05

kiichi54321

総合スコア1984

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

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

galmacher

2019/02/07 04:06

ご回答ありがとうございます。追加で色々お伺いして恐縮ですが、気が向いたらご回答いただけると幸いです。 ■リソースを使うについて 上記例だと、Imageコントロールの <Image.Style>の内容をリソースに定義するのだと思いますが、その場合、ボタンによって3.jpgを使ったり、4.jpgを使ったり…という対応はどのようにすればよいでしょうか。 ■ユーザコントロールを作る について ありがとうございます。検討してみます。 ■データバインディング について 上記例だとImageのSourceプロパティ、ButtonのIsMouseOverプロパティをバインドして、IsMouseOverが変わればSourceも変える、というイメージでしょうか。
kiichi54321

2019/02/07 16:23

WPFの肝である、DataContextを理解しよう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問