2017-08-17 43 views
1

在我的UWP应用程序中,如果用户单击按钮,我试图刷新calendarview上的密度条,问题是,尽管calendarView.UpdateLayout();应该重新运行CalendarViewDayItemChanging事件,它只在第一次加载CalendarView时运行。难道我做错了什么?因为没有布局更新和CalendarViewDayItemChanging当你移动到另一个日历视图时,才会触发无法使用UpdateLayout()刷新CalendarView()[UWP]

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(); 
      } 

回答

2

UpdateLayout不会在这里做任何事情。

就您而言,您只需手动找到所有的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 S,环它们,设置各个相应的颜色。

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

注意你不需要担心新CalendarViewDayItem来临了眼帘,因为他们会被你的CalendarView_CalendarViewDayItemChanging回调处理。