Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改日历控件中某些假日日期的背景_C#_Mysql_Wpf_Calendar - Fatal编程技术网

C# 更改日历控件中某些假日日期的背景

C# 更改日历控件中某些假日日期的背景,c#,mysql,wpf,calendar,C#,Mysql,Wpf,Calendar,我在wpf桌面应用程序中使用一个基本的日历控件,我的要求是使用c#语言将假日(来自mysql数据库的日期)与常规日期区分开来。我的代码如下: <Calendar Name="MyCalendar" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" Grid.RowSpan="6" Foreground="Aqua" SelectionMode="MultipleRange" SelectedDatesChanged="MyCalenda

我在wpf桌面应用程序中使用一个基本的日历控件,我的要求是使用c#语言将假日(来自mysql数据库的日期)与常规日期区分开来。我的代码如下:

<Calendar Name="MyCalendar"  Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" Grid.RowSpan="6"   Foreground="Aqua" SelectionMode="MultipleRange" SelectedDatesChanged="MyCalendar_SelectedDatesChanged" ></Calendar>

如何使用c#更改假日背景颜色?

有几种方法可以实现您的目标,但我将集中讨论一种特定的解决方案

概念

我们将定义一个helper类,该类将具有两个附加的依赖属性,稍后我们将附加到表示
Calendar
控件中特定日期的控件。这些属性将是
Date
-标识控件表示的日期,以及
IsHoliday
-只读属性,指示日期(由
Date
标识)是否为假日。然后,我们将在每个控件上设置一个触发器,每当该控件的
IsHoliday
true
时,该触发器将更改其背景

实施

首先,助手类:

namespace MyHelpers
{
    public class HolidayHelper
    {
        public static DateTime GetDate(DependencyObject obj)
        {
            return (DateTime)obj.GetValue(DateProperty);
        }

        public static void SetDate(DependencyObject obj, DateTime value)
        {
            obj.SetValue(DateProperty, value);
        }

        public static readonly DependencyProperty DateProperty =
        DependencyProperty.RegisterAttached("Date", typeof(DateTime), typeof(HolidayHelper), new PropertyMetadata { PropertyChangedCallback = DatePropertyChanged });

        private static void DatePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var date = GetDate(d);
            SetIsHoliday(d, CheckIsHoliday(date));
        }

        private static bool CheckIsHoliday(DateTime date)
        {
            //here we should determine whether 'date' is a holiday
            //or not and return corresponding value
        }

        private static readonly DependencyPropertyKey IsHolidayPropertyKey =
        DependencyProperty.RegisterAttachedReadOnly("IsHoliday", typeof(bool), typeof(HolidayHelper), new PropertyMetadata());

        public static readonly DependencyProperty IsHolidayProperty = IsHolidayPropertyKey.DependencyProperty;

        public static bool GetIsHoliday(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsHolidayProperty);
        }

        private static void SetIsHoliday(DependencyObject obj, bool value)
        {
            obj.SetValue(IsHolidayPropertyKey, value);
        }
    }
}
每当
Date
属性附加到任何
DependencyObject
或其值更改时,
IsHoliday
属性将相应更新

现在有几个有用的事实:

  • Calendar
    控件中的每个日期都通过
    CalendarDayButton
    控件显示
  • 对于每个
    CalendarDayButton
    控件,相应的日期存储在其
    DataContext
    属性中
  • 可以使用
    Calendar.CalendarDayButtonStyle
    属性为特定的
    Calendar
    自定义
    CalendarDayButtonStyle
    控件
我们需要做的是将
HolidayHelper.Date
属性绑定到
CalendarDayButton.DataContext
,并在
HolidayHelper.IsHoliday
上设置触发器以更新
CalendarDayButton.Background

<Calendar xmlns:helpers="clr-namespace:MyHelpers">
    <Calendar.CalendarDayButtonStyle>
        <Style TargetType="{x:Type CalendarDayButton}">
            <Setter Property="helpers:HolidayHelper.Date" Value="{Binding}" />
            <Style.Triggers>
                <Trigger Property="helpers:HolidayHelper.IsHoliday" Value="True">
                    <Setter Property="Background" Value="..." />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Calendar.CalendarDayButtonStyle>
</Calendar>

我们可以为每个假日创建一个
数据触发器

<Style x:Key="cdbKey" TargetType="CalendarDayButton">
    <Style.Triggers>
          <DataTrigger Binding="{Binding Date}" Value="12/07/2015">
              <Setter Property="Background" Value="Turquoise"/>
          </DataTrigger>
          ... more such DataTriggers for every holiday
    </Style.Triggers>
</Style>
  • 设置日历日期按钮样式
  • 属性

  • 在适当的地方(窗口构造器等)从DB获取您的假期日期

    我们在
    DataTrigger
    中使用
    Binding(“Date”)
    作为我们的
    Binding
    属性值,这是因为
    CalenderDayButton
    自动将
    DataContext
    设置为
    DateTime


  • 我已将
    日历日按钮的
    背景
    更改为SandyBrown,您可以更喜欢它。

    是否要阻止用户选择这些日期?没有用户也可以选择它们。@dipakakade嗨,您检查过答案了吗?提供一些反馈。错误:未定义命名空间前缀“local”。用于日历控制。我不知道怎么解决它@DipakAkhade您缺少的是前缀定义和到适当名称空间的映射。我已经更新了示例,将前缀更改为“helpers”,并将其映射到
    MyHelpers
    名称空间,因此现在它应该可以工作了(请注意“围绕”helper类的名称空间定义)。有关此问题的详细信息,请参见。CalendarDayButton是自动生成的。如果我希望在ASP.net中使用相同的解决方案,则需要进行哪些更改?因为我需要将WPF转换为ASP.net。问问这个ASP.net的家伙。我离开了Asp.net。
    <Style x:Key="cdbKey" TargetType="CalendarDayButton">
        <Style.Triggers>
              <DataTrigger Binding="{Binding Date}" Value="12/07/2015">
                  <Setter Property="Background" Value="Turquoise"/>
              </DataTrigger>
              ... more such DataTriggers for every holiday
        </Style.Triggers>
    </Style>
    
    <Style x:Key="cdbKey" TargetType="CalendarDayButton">
    ...                         
    </Style>
    
    List<DateTime> holidaysDates = _getHolidayDatesFromDB();
    
            Style s = (Style)this.Resources["cdbKey"];
    
            /* Loop through the Dates retrieved from DataBase*/
              DateTime holidayDate = DateTime.Parse("10/02/2015");
              DataTrigger dataTrigger = new DataTrigger() { Binding = new Binding("Date"), Value = holidayDate };
              dataTrigger.Setters.Add(new Setter(CalendarDayButton.BackgroundProperty, Brushes.SandyBrown));
              s.Triggers.Add(dataTrigger);
            /*End Loop*/