2010-11-11 7 views
2

Je développe quelque chose qui nécessitera des fonctionnalités similaires à la Silverlight DatePicker - un popup contenant un contrôle Calendrier sera affiché, et après que l'utilisateur clique sur une date, ou utilise le clavier Pour sélectionner une date et appuyer sur Entrée/Espace, la fenêtre contextuelle devrait se fermer.Détection lorsqu'un jour est cliqué sur le contrôle Silverlight Calendar

Je peux montrer le calendrier très bien, mais je n'arrive pas à déterminer quand l'utilisateur a cliqué un jour ou appuyé sur enter/space. L'événement SelectedDatesChanged n'indique pas si l'utilisateur a cliqué sur la date sélectionnée ou s'il la transmettait simplement avec le clavier. Le réflecteur indique que le contrôle DatePicker est en train de tricher, en utilisant un événement interne DayButtonMouseUp sur le contrôle Calendrier.

Est-ce que quelqu'un connaît une solution à ce problème?

Répondre

1

Pas une solution très propre. En outre, il ne prend pas correctement en compte BlackoutDates car la propriété IsBlackOut du bouton est également interne. Je pourrais vérifier manuellement cela dans mon événement de clic, mais pour mes buts je n'ai pas eu besoin de soutenir ceci.

void CalendarControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    var grid = FindVisualChildByName<Grid>(CalendarControl, "MonthView"); 
    // Loaded may be called several times before both the grid and day buttons are created 
    if (grid != null && grid.Children.OfType<System.Windows.Controls.Primitives.CalendarDayButton>().Any()) 
    { 
     // Add our own click event directly to the button 
     foreach (var button in grid.Children.OfType<System.Windows.Controls.Primitives.CalendarDayButton>().Cast<System.Windows.Controls.Primitives.CalendarDayButton>()) 
     { 
      button.Click += new RoutedEventHandler(button_Click); 
     } 
     // We only want to add the event once 
     CalendarControl.Loaded -= new RoutedEventHandler(CalendarControl_Loaded); 
    } 
} 

void button_Click(object sender, RoutedEventArgs e) 
{ 
    var button = (System.Windows.Controls.Primitives.CalendarDayButton)sender; 
    var date = button.DataContext as DateTime?; 
    // The user clicked a date. Close the calendar and do something with it 
} 

FindVisualChildByName est copié à partir http://pwnedcode.wordpress.com/2009/04/01/find-a-control-in-a-wpfsilverlight-visual-tree-by-name/

2

Vous pouvez y parvenir en mettant l'ClickMode des DayButtons à 'Hover'. Après cela, vous pouvez passer à l'événement MouseLeftButtonDown

<sdk:Calendar Name="calendar1" MouseLeftButtonDown="calendar1_MouseLeftButtonDown"> 
     <sdk:Calendar.CalendarDayButtonStyle> 
      <Style TargetType="Primitives:CalendarDayButton"> 
       <Setter Property="ClickMode" Value="Hover"/> 
      </Style> 
     </sdk:Calendar.CalendarDayButtonStyle> 
    </sdk:Calendar>