我在这里记录了 Microsoft 的问题 - Repro 可供下载: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 Click outside a TaskPane not raise
该问题的答案显示该问题被报告为连接一段时间,但仍然没有解决 VSTO 4.0 SP1 的问题:https ://connect.microsoft.com/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-任务窗格与 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 互操作(例如 c:\Program Files x86\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll)。
构建解决方案。注释掉不起作用的部分。构建解决方案。
现在将 TaskPaneCtrl 拖放到 TaskPaneView 上并取消注释无法编译的内容。
F5 并单击日历控件,现在尝试选择任务窗格区域之外的日期。没有值更改事件触发,它的行为就像在日历外单击!
注意:我尝试了一个脱离控件的下拉列表,但它的事件确实发生了!