2010-08-18 2 views
1

J'ai un contrôle Calendrier étendu lié à une classe contenant des valeurs de date et d'état. L'idée est essentiellement de différencier entre les jours fériés nationaux, les jours fériés, et les congés personnels. Je les affiche dans différentes couleurs à l'aide d'un convertisseur qui inspecte la date actuelle par rapport à la liste des objets associés au contrôle de calendrier pour choisir une couleur de remplissage pour un élément dans CalendarDay. Tout cela fonctionne parfaitement. Le problème est que je veux soutenir que lorsque l'utilisateur clique sur un jour (dans un mode donné), ils peuvent sélectionner, ou désélectionner cette date comme un jour de congé/vacances. En utilisant PreviewMouseDown, je sélectionne l'objet par le contexte de données sélectionné (datetime) et je mets à jour son état. Cela fonctionne bien, mais je ne peux pas obtenir le contrôle du calendrier pour effectuer une actualisation.Contrôle du calendrier, modification de la couleur d'arrière-plan d'un jour au clic

Le calendrier n'est pas lié à ma classe personnalisée, je ne sais pas exactement comment un CalendarDay est lié, mais il semble avoir juste un contexte de données pointant sur une valeur DateTime. Donc NotifyPropertyChanged est sorti. Si je clique sur une date et que je change de mois, la date apparaît surlignée comme prévu, ce dont j'ai besoin, c'est de dire au calendrier de repeindre. J'ai cherché des exemples pour forcer les repeints, et rien n'a fonctionné jusqu'ici.

J'ai essayé UpdateLayout() entre autres choses. Je ne sais pas si c'est un problème parce que j'essaye de rendre le rendu à partir d'un événement souris. Des idées pour repeindre un contrôle de calendrier afin qu'un convertisseur puisse être lancé?

+0

Ok, je pense que j'ai fait des progrès avec ça, mais ce n'est pas encore 100%. Si j'ajoute ceci: var test = VisualTreeHelper.GetChild (VisualTreeHelper.GetParent (e.OriginalSource comme DependencyObject), 1) comme Rectangle; test.Fill = nouveau SolidColorBrush (Colors.Red); ... à l'événement mousedown lorsque vous cliquez sur un jour, je peux modifier le remplissage de l'élément dans CalendarDay. J'espérais que cela déclencherait une mise en page où le convertisseur remplacerait le réglage. Malheureusement, il semble avoir dépassé la couleur du modèle. (Ce jour-là est rouge tous les mois.) –

Répondre

3

FINALEMENT trouvé. Afficher pour la prospérité dans le cas où d'autres ont essayé de faire quelque chose de similaire.

Comme mentionné dans le commentaire, la définition de la couleur de remplissage de l'élément a modifié la couleur de l'arrière-plan, mais a été utilisée pour ce jour tous les mois. Cela avait du sens en réalité parce que le remplissage était normalement géré par le gabarit et réglé en fonction de la liaison et d'un convertisseur.

La solution consistait à réinitialiser la liaison sur l'événement de souris vers le bas lorsqu'une date est cliquée. Ce est le code d'événement:

protected override void OnPreviewMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e) 
    { 
     if (!(e.OriginalSource is FrameworkElement && 
      (e.OriginalSource as FrameworkElement).DataContext is DateTime)) 
     { 
      base.OnPreviewMouseLeftButtonDown(e); 
      return; 
     } 

     DateTime dateTime = (DateTime)(e.OriginalSource as FrameworkElement).DataContext; 

     var calendarDay = _calendarDays.Single(d => d.CalendarDate == dateTime); 

     if (calendarDay.IsHoliday) 
     { 
      calendarDay.CalendarKey = null; 
     } 
     else 
     { 
      calendarDay.CalendarKey = Guid.NewGuid(); 
     } 
     var holidayBackgroundRect = VisualTreeHelper.GetChild(VisualTreeHelper.GetParent(e.OriginalSource as DependencyObject), 1) as Rectangle; 
     var binding = new MultiBinding(); 
     binding.Bindings.Add(new Binding()); 
     binding.Bindings.Add(new Binding() { ElementName = "Calendar" }); 
     binding.Converter = new CalendarDayColorConverter(); 
     holidayBackgroundRect.SetBinding(Rectangle.FillProperty, binding); 
     base.OnPreviewMouseLeftButtonDown(e); 

    } 

Le convertisseur est ce qui détermine la couleur du jour. il accepte la date limite actuelle du calendrier, et le calendrier contrôle lui-même où il peut récupérer la liste actuelle des jours fériés.

En spécifiant de nouveau la liaison, le jour du calendrier est forcé à actualiser cette date.

Quelle douleur complète qui a été.

Questions connexes