我试图将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");
}
答案 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;
}