日历控件选择的日期WPF

时间:2018-12-01 20:23:00

标签: c# wpf calendar

我试图将MouseDoubleClick事件绑定到用户仅在日历中某天双击的时候,这将为该天打开一个新窗口。但是,即使用户双击日历区域中的其他任何位置,也会执行后者并获取突出显示的日期。

我尝试使用样式选项来执行此操作,但是得到的结果与将其放在日历定义行中的结果相同:

<Calendar x:Name="calendar" Grid.Column="1" HorizontalAlignment="Stretch"
          Margin="10,7,0,0" VerticalAlignment="Top" IsTodayHighlighted="True" 
          MouseDoubleClick="event">

结果与

相同
<Style TargetType="CalendarDayButton">
  <EventSetter Event="MouseDoubleClick" Handler="Cdb_MouseDoubleClick"/>
</Style>

如何区分按一天,按月份和什么都不按,而不是重点?

编辑(此方法正在使用xaml):

<Calendar x:Name="calendar" Grid.Column="1" HorizontalAlignment="Stretch"
          Margin="10,7,0,0" VerticalAlignment="Top" 
          IsTodayHighlighted="True" SelectionMode="SingleDate">
  <Calendar.CalendarDayButtonStyle>
    <Style TargetType="CalendarDayButton">
      <EventSetter Event="MouseDoubleClick" Handler="CalendarDayButton_MouseDoubleClick"/>
    </Style>
  </Calendar.CalendarDayButtonStyle>
</Calendar>

private void CalendarDayButton_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
   MessageBox.Show("Test");
}

1 个答案:

答案 0 :(得分:1)

对于这样的事情,我通常会看e.OriginalSource,然后走到可视化树中以找到目标父类型(在您的情况下为CalendarDayButton)。原始来源通常是TextBlock或某种原语,因为这是用户实际单击的内容。另外,也无需将样式应用于CalendarDayButton

因此,如果您按照第一行代码将双击事件处理程序放在Calendar上,则可以按以下方式进行操作。在那里,如果找不到的可视父项,则FindParentOfType()方法将返回null。然后,只需测试null。如果不是null,则表示您有正确的目标。

<Calendar x:Name="calendar" Grid.Column="1" HorizontalAlignment="Stretch"
          Margin="10,7,0,0" VerticalAlignment="Top" IsTodayHighlighted="True" 
          MouseDoubleClick="calendar_MouseDoubleClick">


private void calendar_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject originalSource = e.OriginalSource as DependencyObject;
    CalendarDayButton day = FindParentOfType<CalendarDayButton>(originalSource);
    if (day != null)
    {
        //open menu
    }
    e.Handled = true;
}

//and you will need this helper method
//generally a staple in any WPF programmer's arsenal
public static T FindParentOfType<T>(DependencyObject source) where T : DependencyObject
{
    T ret = default(T);
    DependencyObject parent = VisualTreeHelper.GetParent(source);

    if (parent != null)
    {
        ret = parent as T ?? FindParentOfType<T>(parent) as T;
    }
    return ret;
}