UWP:在CalendarView中自动突出显示整个星期

UWP:在CalendarView中自动突出显示整个星期,uwp,calendar,selection,highlight,calendarview,Uwp,Calendar,Selection,Highlight,Calendarview,我正在UWP应用程序中使用CalendarView。它以“月”模式显示。我想要的是,当用户选择日期时,它应该以某种方式突出显示所选日期的整个星期 我能够使用以下代码获得一些东西,这些代码选择了用户选择日期后一周中的所有日子,但它看起来不是很好,事件处理分离/附加很麻烦且容易出错,我相信可能会有更合适的选项: private void cvMain\u SelectedDatesChanged(CalendarView发件人,CalendarView selectedDateSchangedEve

我正在UWP应用程序中使用CalendarView。它以“月”模式显示。我想要的是,当用户选择日期时,它应该以某种方式突出显示所选日期的整个星期

我能够使用以下代码获得一些东西,这些代码选择了用户选择日期后一周中的所有日子,但它看起来不是很好,事件处理分离/附加很麻烦且容易出错,我相信可能会有更合适的选项:

private void cvMain\u SelectedDatesChanged(CalendarView发件人,CalendarView selectedDateSchangedEventArgs)
{
//分离事件处理程序以防止无休止的循环
this.cvMain.SelectedDatesChanged-=cvMain\u SelectedDatesChanged;
尝试
{
如果(args.addedates.Count>0)
{
//获取选择的第一个日期
var addedDateOffset=args.AddedDates[0];
var userSelectedDate=addedDateOffset.Date;
//获取所选方式的第一天和最后一天
var startOfWeek=userSelectedDate.startOfWeek();
var endOfWeek=userSelectedDate.endOfWeek();
var selectedDatesList=新列表();
selectedDatesList.Add(startOfWeek);

对于(var dateInBetween=startOfWeek;dateInBetween我已经想到了一个解决方案,但它不一定是一个好的解决方案,所以我只是在这里把它作为一个备选方案:-D

我已尝试为此创建行为。首先,您需要安装行为包:

安装包Microsoft.Xaml.Behaviors.Uwp.Managed-版本2.0.0
现在,行为如下所示:

公共类WeekHighlightBehavior:行为
{
公共日历视图日历控件
{
获取{return(CalendarView)GetValue(CalendarProperty);}
set{SetValue(CalendarProperty,value);}
}
//使用DependencyProperty作为日历的备份存储。这将启用动画、样式、绑定等。。。
公共静态只读DependencyProperty CalendarProperty=
DependencyProperty.Register(“CalendarControl”、typeof(CalendarView)、typeof(WeekHighlightBehavior)、new PropertyMetadata(0));
受保护的覆盖无效附加()
{
base.onatached();
CalendarControl.SelectedDatesChanged+=日历\u SelectedDatesChanged;
}
私有无效日历\u SelectedDatesChanged(日历视图发件人,日历视图SelectedDateSchangedEventArgs)
{
var dayItem=this.AssociatedObject作为CalendarViewDayItem;
var calendar=CultureInfo.currentui culture.calendar;
bool highlight=false;
foreach(参数中的变量日期)
{
if(calendar.GetWeekOfYear(date.DateTime,CalendarWeekRule.FirstDay,DayOfWeek.Monday)==
calendar.GetWeekOfYear(dayItem.Date.DateTime,CalendarWeekRule.FirstDay,DayOfWeek.Monday))
{
突出显示=正确;
打破
}
}
如果(突出显示)
{
dayItem.Background=新的SolidColorBrush(Colors.Yellow);
}
其他的
{
dayItem.Background=null;
}
}
附加时受保护的覆盖无效()
{
base.OnDetaching();
CalendarControl.SelectedDatesChanged-=日历\u SelectedDatesChanged;
}
}
该行为基本上观察
CalendarView
SelectedDatesChanged
事件,每次执行时,它都会检查所选日期的一年中的一周是否与该行为附加到的一天中的一年中的一周相匹配。如果是,我们会更改项目的背景。这将对所有日期调用,因此这周肯定会很精彩

不幸的是,事实证明,您无法通过XAML中的样式设置器附加它:


这样,对于创建的第一个项目,该行为只设置一次。但是,您可以在
CalendarViewDayItemChangeing
事件中从隐藏的代码中设置该行为:

private void CalendarView\u CalendarViewDayItemChangeing(CalendarView发件人、CalendarViewDayItemChangingEventArgs参数)
{
var behavior=new WeekHighlightBehavior();
behavior.CalendarControl=日历视图;
Interaction.GetBehaviors(args.Item).Clear();
Interaction.GetBehaviors(args.Item).Add(behavior);
}

我正在手动清除附加的行为,因为我注意到它们没有被自动清除,因为
CalendarView
保留了
CalendarDayViewItem
实例,并根据需要重新使用它们。

谢谢,我能够用您的示例运行它。现在看起来更好了,我认为这是一个干净的解决方案…好的,如果它能通过XAML工作就好了,但也许在UWP的未来版本或行为框架中这是可能的。是的,希望对我来说这似乎是一个bug,能够通过setter设置它会很有用。如果我们能够以某种方式轻松访问
CalendarViewDayItems
也会很好。