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






4.67/5 (4投票s)
一个 Silverlight 中的日期选择器控件,具有多月视图。
引言
在处理一个项目需求时,我们遇到了需要一个支持多月视图的日期选择器的情况。我在网上搜索并尝试找到是否有这样的解决方案,但令我惊讶的是,没有找到任何解决方案。也许我不擅长搜索。:) 所以我想深入研究这个主题,并尝试创建自定义控件。
多月视图日期选择器
原生的日期选择器带有一个弹出窗口,一次只显示一个月,但你有没有见过机票预订网站,它们显示的日期选择器日历一次显示三个月?像这样
嗯,我们想实现同样的目标。我们有第三方供应商提供的此类控件,例如 Telerik 和一个 Open Source 项目,位于 CodePlex。虽然 Open Source CodePlex 项目确实提供了完全相同的功能,但它带有自己的一套从头开始编写的日历和日期选择器类,我们不想参与彻底的测试,并且还想避免应用程序界面和体验中的任何不匹配。所以我想让我们在现有的基础上构建一些东西,并修改日期选择器的一些属性来实现我们想要的东西。
背后的概念
日期选择器控件带有一个位于 System.Windows.Controls.Primitives
命名空间下的弹出控件。弹出控件绑定到一个可以用来显示内容的控件。更多细节可以在 这里 找到。在编辑日期选择器模板时,我们将获得一个弹出窗口,如下图所示。
这里,弹出窗口包含一个日历控件,它反过来用于显示日期。为了实现多月视图日历,我们将清除现有的弹出窗口子控件,并添加我们自己的用户控件作为弹出窗口下的子控件。
因此,本文的其余部分可以分为以下几个部分
- 创建一个多月视图日历控件
- 创建一个模板化的日期选择器并使用自定义日历控件作为弹出窗口
创建自定义多月视图日历用户控件
让我们添加一个用户控件,它将充当给定下拉控件的弹出窗口。
基本上,此控件将保存两个日历控件,它们将显示所选日期之后的三个月。让我给你展示一个控件放置的大致图像。
为了实现上述目标,我们将自定义模板并将应用 CalenderItemStyle
。让我们使用 Blend 查看模板样式并进行必要的调整。
为了隐藏单个日历控件,我们发现最好的方法是将按钮的宽度和高度属性设置为零。
通过对样式的上述更改,我们将创建另一个名为 CalenderNavButtonDisabled
的新 calenderItemTemplete
样式。让我们创建一个 ResourceDictonary
并添加上述模板。
让我们将此资源字典合并到上面创建的用户控件中。
并将样式应用于日历控件。
现在,我们将把导航按钮样式应用于最顶部的导航栏。为此,我们将添加另外两个样式
上述模板样式的修改将为我们提供一个如下图所示的用户控件
向自定义控件添加代码隐藏逻辑
一旦设计部分完成,我们将添加一些逻辑来管理控件的运行时行为。对于第一个日历,在月份选择更改时,另一个日历应显示下个月。因此,我们将以下代码添加到 Calnder_Main_DisplayDateChanged
。
自定义日期选择器用户控件并将用户控件作为弹出窗口包含在内
按照计划,添加一个模板化的日期选择器控件。从 Visual Studio 中选择模板化控件模板并将其命名为 MMVDatePicker
。
日期选择器类带有一个弹出控件,它反过来保存默认的日历控件。基本的想法是从弹出窗口中清除默认控件,并将我们的用户控件添加到弹出窗口中。为了实现这一点,我们将通过重写 OnApplyTemplate
方法来收集弹出控件。
在打开弹出窗口时,用户控件将附加到日期选择器。
嗯,Dispatcher.Begininvoke
纯粹是为了强制 UI 线程在第一次点击时显示控件。
运行时的最终控件
请在此处查看实时控件演示 here。
结论
如果您有任何更好的建议或选择,请告诉我。