Я зарегистрировался проблема с Microsoft здесь - репро доступен для скачивания: https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used-in-vsto-add-ins
Если вы поместите DateTimePicker в плавающую надстройку Excel VSTO, Вставьте и расположите его так, чтобы когда календарь опускался вниз, он находился за пределами надстройки, см. здесь:
Выбор любой из дат, обведенных зеленым, работает, как и ожидалось, но при нажатии любой даты, обведенной красным, он просто закрывает раскрывающийся список календаря и не устанавливает дату!
Кто-нибудь знает, как это исправить?
Этот пользователь SO столкнулся с проблемой при использовании WPF: VSTO WPF ContextMenu.MenuItem Щелкните вне панели задач, не поднятой
Ответ на этот вопрос показывает, что о проблеме сообщалось при подключении некоторое время назад, но до сих пор нет решения с VSTO 4.0 SP1: https://connect. microsoft.com/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-task-pane-with-wpf-context-menu-has-focus-problems
Одним из обходных путей является использование DispatcherFrame для прокачивать сообщения и подписываться на GotFocusEvent и LostFocusEvent для получения меню. http://blogs.msdn.com/b/vsod/archive/2009/12/16/excel-2007-wpf-events-are-not-fired-for-items-that-overlap-excel-ui -for-wpf-context-menus.aspx, но это весь код WPF для меню, а не решение для Winform DateTimePicker.
Репродукция для Microsoft Connect:
Новый проект > Надстройка Excel 2010
using TaskPane;
using Microsoft.Office.Core;
namespace ExcelAddIn2
{
public partial class ThisAddIn
{
TaskPaneView MyTaskView = null;
Microsoft.Office.Tools.CustomTaskPane MyTaskPane = null;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
//setup custom taskpane
MyTaskView = new TaskPaneView();
MyTaskView.currentInstance = Globals.ThisAddIn.Application;
MyTaskPane = this.CustomTaskPanes.Add(MyTaskView, "MyTaskView");
MyTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
MyTaskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
MyTaskPane.Visible = true;
}
}
Меню «Файл» > «Добавить» > «Новый проект» > «Библиотека классов» > с именем TaskPane
Затем в проекте TaskPane создайте пользовательский элемент управления с именем TaskPaneView
public partial class TaskPaneView : UserControl
{
public TaskPaneView()
{
InitializeComponent();
}
public Microsoft.Office.Interop.Excel.Application currentInstance { get; set; }
public TaskPaneCtrl getTaskPaneCtrl
{
get { return this.taskPaneCtrl1; }
}
}
Затем создайте пользовательский элемент управления с помощью DateTimePicker, убедитесь, что элемент управления «Календарь» расположен в правом нижнем углу пользовательского элемента управления.
public partial class TaskPaneCtrl : UserControl
{
public TaskPaneCtrl()
{
InitializeComponent();
}
}
В библиотеке классов TaskPane сошлитесь на Excel Interop (например, c:\Program Files x86\Microsoft Visual Studio). 14.0\Visual Studio Tools для Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll).
Создайте решение. Комментирование неработающих частей. Построить решение.
Теперь перетащите TaskPaneCtrl в TaskPaneView и раскомментируйте то, что не удалось скомпилировать.
F5 и щелкните элемент управления календарем, теперь попробуйте выбрать дату, которая находится за пределами области задач. Событие No Value Change срабатывает, оно ведет себя как щелчок за пределами календаря!
Примечание. Я попробовал выпадающий список, который выпадает из элемента управления, но его события СРАБАТЫВАЮТ!