我在这里记录了 Microsoft 的问题 - Repro 可供下载:https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used-in-vsto-add-ins https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used-in-vsto-add-ins
如果将 DateTimePicker 放入 Excel VSTO 浮动外接程序中并将其定位,以便当日历下拉时,它位于外接程序的边缘之外,请参见此处:
选择绿色圈出的任何日期都可以按预期工作,但是当单击红色圈出的任何日期时,它只是关闭日历下拉列表,而不会设置日期!
有谁知道我该如何解决这个问题?
Edit
这位 SO 用户在使用 WPF 时遇到了问题:VSTO WPF ContextMenu.MenuItem 单击未引发的 TaskPane 外部 https://stackoverflow.com/questions/8449745/vsto-wpf-contextmenu-menuitem-click-outside-a-taskpane-not-raised
该问题的答案显示,该问题已报告为连接一段时间,但 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 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-上下文菜单.aspx 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项目中创建一个名为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 for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll)。
构建解决方案。注释掉不起作用的部分。构建解决方案。
现在将 TaskPaneCtrl 拖放到 TaskPaneView 上,并取消注释无法编译的内容。
F5 并单击日历控件,现在尝试选择任务窗格区域之外的日期。不会触发值更改事件,它的行为就像在日历外部单击一样!
注意:我尝试了一个脱离控件的下拉列表,但它的事件确实发生了!