Календарь контроля выбранной даты WPF - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь привязать мое событие 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 голосов
/ 02 декабря 2018

Для чего-то подобного я обычно смотрю на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...