65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlight 中的多月视图日期选择器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (4投票s)

2011 年 7 月 27 日

CPOL

4分钟阅读

viewsIcon

37153

downloadIcon

864

一个 Silverlight 中的日期选择器控件,具有多月视图。

引言

在处理一个项目需求时,我们遇到了需要一个支持多月视图的日期选择器的情况。我在网上搜索并尝试找到是否有这样的解决方案,但令我惊讶的是,没有找到任何解决方案。也许我不擅长搜索。:) 所以我想深入研究这个主题,并尝试创建自定义控件。

多月视图日期选择器

原生的日期选择器带有一个弹出窗口,一次只显示一个月,但你有没有见过机票预订网站,它们显示的日期选择器日历一次显示三个月?像这样

Multiple MonthView DatePicker Control in Silverlight

嗯,我们想实现同样的目标。我们有第三方供应商提供的此类控件,例如 Telerik 和一个 Open Source 项目,位于 CodePlex。虽然 Open Source CodePlex 项目确实提供了完全相同的功能,但它带有自己的一套从头开始编写的日历和日期选择器类,我们不想参与彻底的测试,并且还想避免应用程序界面和体验中的任何不匹配。所以我想让我们在现有的基础上构建一些东西,并修改日期选择器的一些属性来实现我们想要的东西。

背后的概念

日期选择器控件带有一个位于 System.Windows.Controls.Primitives 命名空间下的弹出控件。弹出控件绑定到一个可以用来显示内容的控件。更多细节可以在 这里 找到。在编辑日期选择器模板时,我们将获得一个弹出窗口,如下图所示。

Multiple MonthView DatePicker Control in Silverlight

这里,弹出窗口包含一个日历控件,它反过来用于显示日期。为了实现多月视图日历,我们将清除现有的弹出窗口子控件,并添加我们自己的用户控件作为弹出窗口下的子控件。

因此,本文的其余部分可以分为以下几个部分

  • 创建一个多月视图日历控件
  • 创建一个模板化的日期选择器并使用自定义日历控件作为弹出窗口

创建自定义多月视图日历用户控件

让我们添加一个用户控件,它将充当给定下拉控件的弹出窗口。

Multiple MonthView DatePicker Control in Silverlight

基本上,此控件将保存两个日历控件,它们将显示所选日期之后的三个月。让我给你展示一个控件放置的大致图像。

Multiple MonthView DatePicker Control in Silverlight

为了实现上述目标,我们将自定义模板并将应用 CalenderItemStyle。让我们使用 Blend 查看模板样式并进行必要的调整。

Multiple MonthView DatePicker Control in Silverlight

Multiple MonthView DatePicker Control in Silverlight

为了隐藏单个日历控件,我们发现最好的方法是将按钮的宽度和高度属性设置为零。

Multiple MonthView DatePicker Control in Silverlight

通过对样式的上述更改,我们将创建另一个名为 CalenderNavButtonDisabled 的新 calenderItemTemplete 样式。让我们创建一个 ResourceDictonary 并添加上述模板。

Multiple MonthView DatePicker Control in Silverlight

让我们将此资源字典合并到上面创建的用户控件中。

并将样式应用于日历控件。

现在,我们将把导航按钮样式应用于最顶部的导航栏。为此,我们将添加另外两个样式

image

上述模板样式的修改将为我们提供一个如下图所示的用户控件

Multiple MonthView DatePicker Control in Silverlight

向自定义控件添加代码隐藏逻辑

一旦设计部分完成,我们将添加一些逻辑来管理控件的运行时行为。对于第一个日历,在月份选择更改时,另一个日历应显示下个月。因此,我们将以下代码添加到 Calnder_Main_DisplayDateChanged

自定义日期选择器用户控件并将用户控件作为弹出窗口包含在内

按照计划,添加一个模板化的日期选择器控件。从 Visual Studio 中选择模板化控件模板并将其命名为 MMVDatePicker

Multiple MonthView DatePicker Control in Silverlight

日期选择器类带有一个弹出控件,它反过来保存默认的日历控件。基本的想法是从弹出窗口中清除默认控件,并将我们的用户控件添加到弹出窗口中。为了实现这一点,我们将通过重写 OnApplyTemplate 方法来收集弹出控件。

在打开弹出窗口时,用户控件将附加到日期选择器。

嗯,Dispatcher.Begininvoke 纯粹是为了强制 UI 线程在第一次点击时显示控件。

运行时的最终控件

Multiple MonthView DatePicker Control in Silverlight

请在此处查看实时控件演示 here

结论

如果您有任何更好的建议或选择,请告诉我。

© . All rights reserved.