Silverlight/WPF日历如何获取可见日期
Silverlight/WPF Calendar how to get visible dates
我想获取日历中的可见日期,例如下图我想获取 2015 年 6 月 28 日 到 2015 年 8 月 8 日
我在事件 DisplayDateChanged 中得到的全部是
添加日期 = {01/07/2015 00:00:00}(7 月 1 日)
移除日期 = {25/06/2015 00:00:00}(6 月 25 日)
起初我以为 DisplayDateStart 和 DisplayDateEnd 会给我这个信息,但我意识到这些属性不是只读的,而是我将它们设置用于其他目的,例如将要显示的日期范围。
那么有什么解决方法或方法来计算或获得我想要的结果吗?
我通过一些问题得到了答案,并对我的日历模板做了一些更改。
我单击了编辑其他模板/编辑 CalendarDayButtonStyle,然后我添加了以下内容:
<Setter Property="Tag" Value="{Binding Path=Date}" />
private void myCal_DisplayDateChanged(object sender, CalendarDateChangedEventArgs e)
{
var grid = FindVisualChildByName<Grid>(myCal, "MonthView");
DateTime? dtBegin = null;
DateTime? dtEnd = null;
if (grid != null && grid.Children.OfType<System.Windows.Controls.Primitives.CalendarDayButton>().Any())
{
foreach (var button in grid.Children.OfType<System.Windows.Controls.Primitives.CalendarDayButton>().Cast<System.Windows.Controls.Primitives.CalendarDayButton>())
{
if (dtBegin == null)
dtBegin = Convert.ToDateTime(button.Tag);
else
dtEnd = Convert.ToDateTime(button.Tag);
}
}
}
public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name);
if (result != null)
return result;
}
}
return null;
}
Detecting when a day is clicked on the Silverlight Calendar control
https://pwnedcode.wordpress.com/2009/04/01/find-a-control-in-a-wpfsilverlight-visual-tree-by-name/
我想获取日历中的可见日期,例如下图我想获取 2015 年 6 月 28 日 到 2015 年 8 月 8 日
我在事件 DisplayDateChanged 中得到的全部是
添加日期 = {01/07/2015 00:00:00}(7 月 1 日)
移除日期 = {25/06/2015 00:00:00}(6 月 25 日)
起初我以为 DisplayDateStart 和 DisplayDateEnd 会给我这个信息,但我意识到这些属性不是只读的,而是我将它们设置用于其他目的,例如将要显示的日期范围。
那么有什么解决方法或方法来计算或获得我想要的结果吗?
我通过一些问题得到了答案,并对我的日历模板做了一些更改。
我单击了编辑其他模板/编辑 CalendarDayButtonStyle,然后我添加了以下内容:
<Setter Property="Tag" Value="{Binding Path=Date}" />
private void myCal_DisplayDateChanged(object sender, CalendarDateChangedEventArgs e)
{
var grid = FindVisualChildByName<Grid>(myCal, "MonthView");
DateTime? dtBegin = null;
DateTime? dtEnd = null;
if (grid != null && grid.Children.OfType<System.Windows.Controls.Primitives.CalendarDayButton>().Any())
{
foreach (var button in grid.Children.OfType<System.Windows.Controls.Primitives.CalendarDayButton>().Cast<System.Windows.Controls.Primitives.CalendarDayButton>())
{
if (dtBegin == null)
dtBegin = Convert.ToDateTime(button.Tag);
else
dtEnd = Convert.ToDateTime(button.Tag);
}
}
}
public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name);
if (result != null)
return result;
}
}
return null;
}
Detecting when a day is clicked on the Silverlight Calendar control
https://pwnedcode.wordpress.com/2009/04/01/find-a-control-in-a-wpfsilverlight-visual-tree-by-name/