我的C#/ WPF项目需要一个日历。我们将使用它来为预约安排选择一系列日期。我被告知默认日历太小而无法被我们的一些销售代表使用,所以我一直在努力调整它。
<toolkit:Calendar Grid.Row="1" x:Name="DateWindowCalendar"
BorderBrush="White" BorderThickness="0"
Style="{StaticResource PopupCalendarStyle}"
DisplayMode="Month" SelectionMode="SingleRange"
DisplayDateStart="{Binding FirstDayOfMonth}"
AutomationProperties.AutomationId="ToolkitCalendarId"
VerticalAlignment="Top">
</toolkit:Calendar>
我创造了这种造型:
<Style x:Key="PopupCalendarStyle" TargetType="toolkit:Calendar">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="toolkit:Calendar">
<StackPanel Margin="0" HorizontalAlignment="Center" x:Name="Root">
<toolkit:Calendar x:Name="Calendar"
SelectedDate="{TemplateBinding SelectedDate}"
DisplayDateStart="{TemplateBinding DisplayDateStart}"
SelectionMode="{TemplateBinding SelectionMode}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SelectedDatesChanged="Calendar_SelectedDatesChanged">
<toolkit:Calendar.CalendarDayButtonStyle>
<Style>
<Setter Property="Button.Height" Value="34"/>
<Setter Property="Button.Width" Value="34" />
<Setter Property="Button.FontSize" Value="16" />
</Style>
</toolkit:Calendar.CalendarDayButtonStyle>
<toolkit:Calendar.CalendarButtonStyle>
<Style>
<Setter Property="Button.Height" Value="34"/>
<Setter Property="Button.Width" Value="34"/>
<Setter Property="Button.FontSize" Value="16"/>
</Style>
</toolkit:Calendar.CalendarButtonStyle>
</toolkit:Calendar>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
一切都近乎完美。我指定了我的范围,我可以跟踪选定的日期(使用SelectedDatesChanged事件而不是SelectedDates属性授予。
问题是我还需要能够设置中断日期(通常是月初至今之间的时间段,尽管有时从一个月的第一天到现在的几天)。
没有样式,这有效:
DateWindowCalendar.BlackoutDates.Add(new CalendarDateRange(
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 01), DateTime.Now));
但是当我添加样式时,我不会显示黑屏显示,更糟糕的是可以选择限制日期。
我不确定我错过了什么,但我希望有人能够轻松回答,这样我就无需重建整个小部件。
感谢任何帮助。
谢谢,
克里斯
答案 0 :(得分:1)
按照你的风格,我看不出你在哪里尊重“限制日期”。基本风格是什么样的?我假设在基本样式中,Calendar控件上有一个名为blackout date的属性,它绑定到BlackoutDates Collection。
这样的事情:
<Style x:Key="PopupCalendarStyle" TargetType="toolkit:Calendar">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="toolkit:Calendar">
<StackPanel Margin="0" HorizontalAlignment="Center" x:Name="Root">
<toolkit:Calendar x:Name="Calendar"
SelectedDate="{TemplateBinding SelectedDate}"
DisplayDateStart="{TemplateBinding DisplayDateStart}"
BlackoutDates="{TemplateBinding BlackoutDates}"
SelectionMode="{TemplateBinding SelectionMode}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SelectedDatesChanged="Calendar_SelectedDatesChanged">
<toolkit:Calendar.CalendarDayButtonStyle>
<Style>
<Setter Property="Button.Height" Value="34"/>
<Setter Property="Button.Width" Value="34" />
<Setter Property="Button.FontSize" Value="16" />
</Style>
</toolkit:Calendar.CalendarDayButtonStyle>
<toolkit:Calendar.CalendarButtonStyle>
<Style>
<Setter Property="Button.Height" Value="34"/>
<Setter Property="Button.Width" Value="34"/>
<Setter Property="Button.FontSize" Value="16"/>
</Style>
</toolkit:Calendar.CalendarButtonStyle>
</toolkit:Calendar>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 1 :(得分:1)
好的......那不是它,但我会把这个答案留给下一个人。
第一个BlackoutDates是一些可读的范围集合的可怕的混合物。几乎无法辨认。我开始重写小部件,但没有那么远。
我找到了有用的东西。您可以在代码中设置中断范围。
但是,如果在构造期间执行此操作,则不会通过模板传递(不确定原因)。因此,如果您构建一个日历,然后设置有效的中断范围。但是当你设置那个Calendar时,它没有模板绑定(因为它不是一个依赖属性,它不能被绑定)。
但是......看起来如果你通过样式生成的事件设置BlackoutDates,则设置日期。我使用了加载的事件:
<Style x:Key="PopupCalendarStyle" TargetType="toolkit:Calendar">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="toolkit:Calendar">
<StackPanel Margin="0" HorizontalAlignment="Center" x:Name="Root">
<toolkit:Calendar x:Name="Calendar"
SelectedDate="{TemplateBinding SelectedDate}"
DisplayDateStart="{TemplateBinding DisplayDateStart}"
SelectionMode="{TemplateBinding SelectionMode}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SelectedDatesChanged="Calendar_SelectedDatesChanged"
**Loaded="Calendar_Loaded"**>
<toolkit:Calendar.CalendarDayButtonStyle>
<Style>
<Setter Property="Button.Height" Value="34"/>
<Setter Property="Button.Width" Value="34" />
<Setter Property="Button.FontSize" Value="16" />
</Style>
</toolkit:Calendar.CalendarDayButtonStyle>
<toolkit:Calendar.CalendarButtonStyle>
<Style>
<Setter Property="Button.Height" Value="34"/>
<Setter Property="Button.Width" Value="34"/>
<Setter Property="Button.FontSize" Value="16"/>
</Style>
</toolkit:Calendar.CalendarButtonStyle>
</toolkit:Calendar>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
完成后,创建一个允许我在样式日历上设置BlackoutDates的加载处理程序是相当简单的:
private void Calendar_Loaded(object sender, RoutedEventArgs e)
{
((Calendar)sender).BlackoutDates.Add(new CalendarDateRange(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 01), DateTime.Now));
}