MonthCalendar BoldedDates вызывает звуковой сигнал с событием DateChanged
Я выделяю даты из события DateChanged элемента управления MonthCalendar в C-Sharp под Visual Studio 2010.
Изменение месяцев при нажатии на предыдущий / следующий месяц вызывает звуковой сигнал. Все работает, хотя.
Как я могу избежать / подавить звуковой сигнал?
Проблема очень проста для копирования.
- Создать новый фиктивный проект WinForm
- Добавить элемент управления MonthCalendar в форму
- Добавить событие DateChanged
Внутри события DateChanged добавьте следующий код:
DateTime[] dteBolded = { new DateTime(2012, 9, 28, 0, 0, 0), new DateTime(2012, 9, 21, 0, 0, 0) }; this.monthCalendar1.RemoveAllBoldedDates(); this.monthCalendar1.BoldedDates = dteBolded;
Запустите, нажмите play внутри VS2010.
- Нажмите предыдущий / следующий месяц. Вы можете услышать звуковой сигнал.
Как мне решить проблему?
Заранее спасибо,
Сара
1 ответ
Свойство BoldedDates является специальным. Его поддержка включается с помощью флага стиля (MCS_DAYSTATE), который указывается при создании собственного элемента управления Windows. Ваш код изменяет свойство, что вызывает повторное создание собственного окна управления. Есть один очевидный способ увидеть это, вы увидите, что он довольно заметно мигает.
Этот звуковой сигнал подается потому, что теперь это новый элемент управления, который получает входное событие. Он сбит с толку и пищит.
Обходной путь - отложить изменение свойства, чтобы обработка ввода была завершена. Что вы можете элегантно сделать с помощью метода Control.BeginInvoke(). Как это:
private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
this.BeginInvoke(new Action(() => {
DateTime[] dteBolded = { new DateTime(2012, 9, 28, 0, 0, 0), new DateTime(2012, 9, 21, 0, 0, 0) };
this.monthCalendar1.RemoveAllBoldedDates();
this.monthCalendar1.BoldedDates = dteBolded;
}));
}