无法使用 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
回调处理。
在我的 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
回调处理。