マウスホバー時のプロパティトリガーの動作について教えて下さい。
まず以下のの通りXAMLでLabelのStyleを定義します。
XAML
1<Window.Resources> 2 <Style TargetType="{x:Type Label}"> 3 <Style.Triggers> 4 <Trigger Property="IsMouseOver" Value="True"> 5 <Setter Property="FontSize" Value="30"/> 6 <Setter Property="Foreground" Value="Red"/> 7 <Setter Property="Background" Value="Yellow"/> 8 </Trigger> 9 </Style.Triggers> 10 </Style> 11 </Window.Resources> 12 <Grid> 13 <Label x:Name="MyLabel" Content="Mouse hover over a Label" 14 HorizontalAlignment="Center" 15 VerticalAlignment="Center"/> 16 </Grid>
このコードの場合はマウスホバー時にFontSize、Foreground、Background全て
正しく変化します。
しかし諸々の理由でコードビハインドからBackgroundプロパティの色をYellow以外に
変える必要があります。例えば上記のXAMLに対して以下の通りコンストラクター
の中でBackgroundプロパティをWhiteに設定します。
C#
1public MainWindow() 2{ 3 InitializeComponent(); 4 MyLabel.Background = Brushes.White; 5}
このようにするとマウスホバー時のBackgroundがWhiteになってしまいます。
望む動作はStyleで定義した通りのYellowになって欲しいのですが方法がわかりません。
何か良い方法がありましたらご教示ください。
実際に実現したいことはLabelコントロールではなくCalendarコントロールです。
改めてXAMLの抜粋を記載致します。複雑になるため動作に関係のないイベントハンドラ
は省略しております。
XAML
1<Viewbox> 2<Calendar x:Name="MyCalendar"> 3 <Calendar.CalendarDayButtonStyle> 4 <Style TargetType="{x:Type CalendarDayButton}"> 5 <Setter Property="Template"> 6 <Setter.Value> 7 <ControlTemplate TargetType="{x:Type CalendarDayButton}"> 8 <Border x:Name="MyHoverButtonBorder" BorderThickness="0.1"> 9 <ContentPresenter/> 10 </Border> 11 <ControlTemplate.Triggers> 12 <!-- マウスオーバー --> 13 <Trigger Property="IsMouseOver" Value="True"> 14 <Setter TargetName="MyHoverButtonBorder" Property="BorderBrush" Value="Pink" /> 15 <Setter TargetName="MyHoverButtonBorder" Property="Background" Value="Pink" /> 16 <Setter Property="Foreground" Value="White" /> 17 </Trigger> 18 </ControlTemplate.Triggers> 19 </ControlTemplate> 20 </Setter.Value> 21 </Setter> 22 </Style> 23 </Calendar.CalendarDayButtonStyle> 24</Calendar> 25</Viewbox>
日をクリックすると背景をグリーン色にしているのですが、事情により
月が変わるたびに全ての日の背景を一度ホワイト色でクリアする必要があります。
クリアはコードビハインドで行っていますが、そうするとマウスホバー時に上記の
XAMLで指定したピンク色にはならずホワイト色のままになってしまいます。
ホワイト色でクリアした後でも個々の日をマウスホバー時にピンク色にすることは
可能でしょうか?
上手く動作したCalendarDayButtonの背景をクリアするコードは以下の通りです。
C#
1void AllDaysClear(CalendarDayButton[] days) 2{ 3 foreach (var day in days) 4 { 5 var border = day.Children<Border>().FirstOrDefault(); 6 if (border != null) 7 { 8 border.BorderBrush = Brushes.Black; 9 //border.Background = Brushes.White; //期待通りの動作をしない 10 border.ClearValue(BackgroundProperty); //期待通りの動作をする 11 day.IsEnabled = true; 12 } 13 } 14}
Childrenメソッドは「じんぐる様」の下記サイトのコードを拝借し検証しました。
https://blog.xin9le.net/entry/2013/10/29/222336
回答2件
あなたの回答
tips
プレビュー