2017-08-17 4 views
1

Dans mon application UWP, j'essaie d'actualiser les barres de densité sur un calendarview si l'utilisateur clique sur un bouton, le problème est que, bien que calendarView.UpdateLayout(); devrait être exécuté l'événement CalendarViewDayItemChanging, il s'exécute uniquement lorsque le CalendarView est chargé la première fois. Est-ce que je fais quelque chose de mal?Impossible d'actualiser un CalendarView avec UpdateLayout() [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(); 
      } 

Répondre

2

UpdateLayout ne feront rien ici car il n'y a pas de mise en page mise à jour et CalendarViewDayItemChanging est uniquement déclenchée lorsque vous passez à une autre vue du calendrier.

Dans votre cas, vous avez juste besoin de localiser manuellement tous les CalendarViewDayItems et de mettre à jour leurs couleurs sur la vue existante.

D'abord, créez un petit Children méthodes d'extension pour aider à récupérer tous les enfants du même type.

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

Ensuite, appelez simplement dans votre bouton gestionnaire de clic pour obtenir tous les CalendarViewDayItem s, boucle les travers et chaque jeu est la couleur en conséquence.

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

Notez que vous n'avez pas à vous soucier de nouveaux CalendarViewDayItem s qui entrent en vue, car ils seront traités par votre rappel CalendarView_CalendarViewDayItemChanging.