カレンダーコントロールの任意の日の背景色と文字色を変更したい
ユーザ操作により祝日を設定する画面の実装を行っております。
祝日設定された日の「背景色を赤」「文字色を白」に変更したいのですがうまくいっておりません。
発生している問題
問題1
下記ページを参考に文字色を変更することは出来ましたが、背景色を変更することが出来ません。
「MainWindow.xaml.cs」の23行目で元々のForeground設定を無効化しているように
Background設定を無効化する必要があるという推測はあるのですが具体的な記述方法がわかりません。
https://iyemon018.hatenablog.com/entry/2016/05/10/231206
問題2
ページロード時のみ適用されておりその後のイベントで祝日設定を増やしても反映されない状態です。
追加ボタン押下時にテキストボックスに入力された日の背景色と文字色が変わるようにしたいです。
該当のソースコード
MainWindow.xaml
xaml
1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 xmlns:con="clr-namespace:WpfApp1" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="450" Width="800"> 10 <Window.Resources> 11 <local:BrushConverter x:Key="BackGroundConverter" /> 12 <local:BrushConverter x:Key="BrushConverter" /> 13 <Style x:Key="DefaultCalendarDayButtonStyle" TargetType="{x:Type CalendarDayButton}"> 14 <Setter Property="Background" Value="{Binding Converter={StaticResource BackGroundConverter}, Mode=OneWay}" /> 15 <Setter Property="Foreground" Value="{Binding Converter={StaticResource BrushConverter}, Mode=OneWay}" /> 16 <Setter Property="Template"> 17 <Setter.Value> 18 <ControlTemplate TargetType="{x:Type CalendarDayButton}"> 19 <ContentPresenter x:Name="NormalText" 20 Margin="5,1,5,1" 21 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 22 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 23 <!--TextElement.Foreground="#FF333333"/>--> 24 </ControlTemplate> 25 </Setter.Value> 26 </Setter> 27 </Style> 28 </Window.Resources> 29 <StackPanel Orientation="Horizontal"> 30 <Calendar x:Name="custom" CalendarDayButtonStyle="{DynamicResource DefaultCalendarDayButtonStyle}" /> 31 <TextBox x:Name="txt" Width="60" Height="40"/> 32 <Button Click="btn_Click" Content="追加" Width="60" Height="40"/> 33 </StackPanel> 34</Window>
MainWindow.xaml.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Windows; 4 5namespace WpfApp1 6{ 7 /// <summary> 8 /// MainWindow.xaml の相互作用ロジック 9 /// </summary> 10 public partial class MainWindow : Window 11 { 12 public MainWindow() 13 { 14 // DBから取得したてい 15 list.Add(new DateTime(2020, 12, 24)); 16 list.Add(new DateTime(2020, 12, 25)); 17 } 18 19 static public List<DateTime> list = new List<DateTime>(); 20 21 private void btn_Click(object sender, RoutedEventArgs e) 22 { 23 try 24 { 25 var date = DateTime.ParseExact(txt.Text, "yyyyMMdd", null); 26 list.Add(date); 27 } 28 catch 29 { 30 MessageBox.Show("yyyyMMdd形式で入力してください"); 31 } 32 } 33 } 34} 35
BackGroundConverter.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace WpfApp1 8{ 9 using System; 10 using System.Globalization; 11 using System.Windows; 12 using System.Windows.Data; 13 using System.Windows.Media; 14 15 /// <summary> 16 /// <see cref="T:DateTime"/>の値から曜日の<see cref="T:Brush"/>リソースへのコンバータークラスです。 17 /// </summary> 18 /// <seealso cref="System.Windows.Data.IValueConverter" /> 19 [ValueConversion(typeof(DateTime), typeof(Brush))] 20 public class BackGroundConverter : IValueConverter 21 { 22 /// <summary>値を変換します。</summary> 23 /// <returns>変換された値。 メソッドが null を返す場合は、有効な null 値が使用されています。</returns> 24 /// <param name="value">バインディング ソースによって生成された値。</param> 25 /// <param name="targetType">バインディング ターゲット プロパティの型。</param> 26 /// <param name="parameter">使用するコンバーター パラメーター。</param> 27 /// <param name="culture">コンバーターで使用するカルチャ。</param> 28 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 29 { 30 if (!(value is DateTime)) 31 { 32 return DependencyProperty.UnsetValue; 33 } 34 35 return MainWindow.list.Any(x => x == (DateTime)value) ? Brushes.Red : DependencyProperty.UnsetValue; 36 } 37 38 /// <summary>値を変換します。</summary> 39 /// <returns>変換された値。 メソッドが null を返す場合は、有効な null 値が使用されています。</returns> 40 /// <param name="value">バインディング ターゲットによって生成される値。</param> 41 /// <param name="targetType">変換後の型。</param> 42 /// <param name="parameter">使用するコンバーター パラメーター。</param> 43 /// <param name="culture">コンバーターで使用するカルチャ。</param> 44 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 45 { 46 throw new NotImplementedException(); 47 } 48 } 49} 50
BrushConverter.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace WpfApp1 8{ 9 using System; 10 using System.Globalization; 11 using System.Windows; 12 using System.Windows.Data; 13 using System.Windows.Media; 14 15 /// <summary> 16 /// <see cref="T:DateTime"/>の値から曜日の<see cref="T:Brush"/>リソースへのコンバータークラスです。 17 /// </summary> 18 /// <seealso cref="System.Windows.Data.IValueConverter" /> 19 [ValueConversion(typeof(DateTime), typeof(Brush))] 20 public class BrushConverter : IValueConverter 21 { 22 /// <summary>値を変換します。</summary> 23 /// <returns>変換された値。 メソッドが null を返す場合は、有効な null 値が使用されています。</returns> 24 /// <param name="value">バインディング ソースによって生成された値。</param> 25 /// <param name="targetType">バインディング ターゲット プロパティの型。</param> 26 /// <param name="parameter">使用するコンバーター パラメーター。</param> 27 /// <param name="culture">コンバーターで使用するカルチャ。</param> 28 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 29 { 30 if (!(value is DateTime)) 31 { 32 return DependencyProperty.UnsetValue; 33 } 34 35 return MainWindow.list.Any(x => x == (DateTime)value) ? Brushes.White : DependencyProperty.UnsetValue; 36 } 37 38 /// <summary>値を変換します。</summary> 39 /// <returns>変換された値。 メソッドが null を返す場合は、有効な null 値が使用されています。</returns> 40 /// <param name="value">バインディング ターゲットによって生成される値。</param> 41 /// <param name="targetType">変換後の型。</param> 42 /// <param name="parameter">使用するコンバーター パラメーター。</param> 43 /// <param name="culture">コンバーターで使用するカルチャ。</param> 44 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 45 { 46 throw new NotImplementedException(); 47 } 48 } 49} 50
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/25 00:58 編集