🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

XAML

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

Q&A

解決済

1回答

3240閲覧

ItemsControl.ItemContainerStyleの挙動がよく分からないです。

vka

総合スコア15

C#

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

XAML

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

0グッド

0クリップ

投稿2019/10/27 18:17

前提・実現したいこと

後述のソースコードでフォームを表示しますと、3行のLabelとTextBoxが表示されます。
その内の1行にマウスカーソルを当てた際、

  • Labelの背景を赤に
  • TextBoxで表示している文字をBoldに

したいと思っています。

そして以下の様に記述しました。

xaml

1<Trigger Property="IsMouseOver" Value="True"> 2 <Setter Property="TextBox.FontWeight" Value="Bold"></Setter> 3 <Setter Property="Label.Background" Value="Red"></Setter> 4</Trigger>

発生している問題・エラーメッセージ

実際に操作しますと、マウスオーバーには反応するのですが、

  • Labelの背景は赤にならない
  • LabelとTextBoxで表示している文字がBold

となってしまいます。

該当のソースコード

xaml

1 <Window.Resources> 2 <XmlDataProvider x:Key="items"> 3 <x:XData> 4 <items xmlns=""> 5 <item index="111111111">aaaaaaaaaa</item> 6 <item index="222222222">bbbbbbbbbb</item> 7 <item index="333333333">cccccccccc</item> 8 </items> 9 </x:XData> 10 </XmlDataProvider> 11 </Window.Resources> 12 <Grid> 13 <ItemsControl ItemsSource="{Binding Source={StaticResource items}, XPath=/items/item}"> 14 <ItemsControl.ItemsPanel> 15 <ItemsPanelTemplate> 16 <StackPanel Orientation="Vertical"></StackPanel> 17 </ItemsPanelTemplate> 18 </ItemsControl.ItemsPanel> 19 20 <ItemsControl.ItemTemplate> 21 <DataTemplate> 22 <StackPanel Orientation="Horizontal"> 23 <Label Content="{Binding XPath=@index}"></Label> 24 <TextBox Text="{Binding XPath=text()}"></TextBox> 25 </StackPanel> 26 </DataTemplate> 27 </ItemsControl.ItemTemplate> 28 29 <ItemsControl.ItemContainerStyle> 30 <Style TargetType="ContentPresenter"> 31 <Style.Triggers> 32 <Trigger Property="IsMouseOver" Value="True"> 33 <Setter Property="TextBox.FontWeight" Value="Bold"></Setter> 34 <Setter Property="Label.Background" Value="Red"></Setter> 35 </Trigger> 36 </Style.Triggers> 37 </Style> 38 </ItemsControl.ItemContainerStyle> 39 </ItemsControl> 40 </Grid>

試したこと

xaml

1<DataTemplate.Triggers> 2 <Trigger Property="IsMouseOver" Value="True"> 3 <Setter Property="TextBox.FontWeight" Value="Bold"></Setter> 4 <Setter Property="Label.Background" Value="Red"></Setter> 5 </Trigger> 6</DataTemplate.Triggers>

に移動しても同じでした。

SetterのPropertyに対する理解が怪しいのかと思い、
https://docs.microsoft.com/en-us/dotnet/api/system.windows.setter.property?view=netframework-4.8
を参照しましたが、読んだ感じでは意図した様に動きそうと思っています。

The following example shows a style declaration that will affect the Background property of a Control. Note that property name in this example is qualified with the name of the class (Control) because the Style does not specify a TargetType.

Google翻訳

次の例は、コントロールのBackgroundプロパティに影響するスタイル宣言を示しています。 この例のプロパティ名は、スタイルがTargetTypeを指定していないため、クラス(Control)の名前で修飾されていることに注意してください。

よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

.NET Core 3.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

これを試してみてください。

XAML

1<DataTemplate> 2 <StackPanel Orientation="Horizontal"> 3 <Label Content="{Binding XPath=@index}" x:Name="label"></Label> 4 <TextBox Text="{Binding XPath=text()}" x:Name="textBox"></TextBox> 5 </StackPanel> 6 <DataTemplate.Triggers> 7 <Trigger Property="IsMouseOver" Value="True"> 8 <Setter TargetName="textBox" Property="FontWeight" Value="Bold"/> 9 <Setter TargetName="label" Property="Background" Value="Red"/> 10 </Trigger> 11 </DataTemplate.Triggers> 12</DataTemplate>

投稿2019/10/28 01:35

Zuishin

総合スコア28669

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

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

vka

2019/10/28 07:55

ありがとうございます! 完璧に動作しました。 なるほど、TargetNameを使うのですね。 追って質問になってしまって申し訳ないのですが、 ・Labelの背景は赤にならない ・LabelとTextBoxで表示している文字がBold となってしまう理由につきまして、ご存知でしたら教えていただけないでしょうか。
Zuishin

2019/10/28 08:06

まず、ItemContainerStyle は項目コンテナに対するスタイルを指定します。この中には TextBox も Label もありません。あるのは DataTemplate の中です。だからこちらでスタイルを設定しなければなりません。 次に、Label.Background という指定の仕方が間違っています。引用先には「TargetType が指定されていないため」と書かれていますが、ここでは指定されているので、状況は全く異なります。 なぜ FontWeight が変わるのかまでは調べていませんが、ツリービジュアライザーか何かで調べてみてはどうでしょうか。 https://docs.microsoft.com/ja-jp/visualstudio/debugger/how-to-use-the-wpf-tree-visualizer?view=vs-2019 https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/advanced/trees-in-wpf 論理ツリーとビジュアルツリーを可視化するツールも探せばあるのではないかと思います。
vka

2019/10/28 08:16

ご丁寧にありがとうございます! なるほど、根本のItemContainerStyleの理解が誤っていたのですね。 だいぶ頓珍漢な質問となっていました…。 ここまでお付き合いくださり、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問