代码之家  ›  专栏  ›  技术社区  ›  David

检测何时在Silverlight日历控件上单击一天

  •  2
  • David  · 技术社区  · 14 年前

    我正在开发一个类似于Silverlight DatePicker的功能——将显示一个包含日历控件的弹出窗口,在用户单击日期或使用键盘选择日期并按enter/space之后,弹出窗口将关闭。

    我可以很好地显示日历,但我不知道用户何时单击了一天或按了回车/空格键。这个 SelectedDatesChanged 事件不指示用户是否单击了所选日期,或者只是用键盘传递。

    反射器显示DatePicker控件在使用内部 DayButtonMouseUp 日历控件上的事件。

    有人知道这个问题的解决办法吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Anonymous7    13 年前

    您可以通过将day按钮的ClickMode设置为“Hover”来实现这一点。 在这之后,你可以进入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>
    
        2
  •  1
  •   David    14 年前

    不是很干净的解决方案。此外,它也没有正确地考虑到BlackoutDates,因为按钮的IsBlackOut属性也是内部的。我可以在click事件中手动检查它,但出于我的目的,我不需要支持它。

    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是从 http://pwnedcode.wordpress.com/2009/04/01/find-a-control-in-a-wpfsilverlight-visual-tree-by-name/