无法使用 UpdateLayout() [UWP] 刷新 CalendarView

Unable to refresh a CalendarView with UpdateLayout() [UWP]

在我的 UWP 应用程序中,如果用户单击按钮,我会尝试刷新 calendarview 上的密度条,问题是,尽管 calendarView.UpdateLayout(); 应该重新 运行 CalendarViewDayItemChanging 事件,它 运行 仅在 CalendarView 第一次加载时发生。难道我做错了什么?

 public MainPage()
        {
            this.InitializeComponent();
            densityColors.Add(Colors.Green); 
        }

      private void CalendarView_CalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
            {
                item = args.Item;
                if (item < DateTimeOffset.Now)
                {
                    item.SetDensityColors(densityColors);
                }

            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                densityColors[0]=Colors.Blue;
                calendarView.UpdateLayout();
            }

UpdateLayout 不会在这里做任何事情,因为没有 layout 更新并且 CalendarViewDayItemChanging 仅在您移动到另一个日历视图时触发。

对于您的情况,您只需手动定位所有 CalendarViewDayItems 并在现有视图中更新它们的颜色。

首先,创建一些 Children 扩展方法来帮助检索相同类型的所有子项。

public static class Helper
{
    public static List<FrameworkElement> Children(this DependencyObject parent)
    {
        var list = new List<FrameworkElement>();

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);

            if (child is FrameworkElement)
            {
                list.Add(child as FrameworkElement);
            }

            list.AddRange(Children(child));
        }

        return list;
    }
}

然后,只需在您的按钮单击处理程序中调用它即可获取所有 CalendarViewDayItem,循环遍历它们并相应地设置每个颜色。

var dayItems = calendarView.Children().OfType<CalendarViewDayItem>();
foreach (var dayItem in dayItems)
{
    dayItem.SetDensityColors(densityColors);
}

请注意,您无需担心新的 CalendarViewDayItem 会出现,因为它们将由您的 CalendarView_CalendarViewDayItemChanging 回调处理。