BUG:广东话选择会超出浮动VSTO外接上的DatePicker日期BUG:广东话选择会超出浮动VS

2019-05-14 00:21发布

这里记录的与微软的问题-摄制可供下载: https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used-在-VSTO-插件

如果你把一个DateTimePicker在Excel中VSTO浮动插件和定位,以便当日历滴下来,它是外接的边缘之外,在这里看到:

选择在任何预期的绿色工程盘旋的日期,但点击红圈内的任何日期的时候,它只是关闭日历下拉,并且不设定日期!

有谁知道我怎么能解决这个问题?

编辑

这个所谓的用户经历了使用WPF的问题: VSTO WPF ContextMenu.MenuItem点击TaskPane外不提高

该问题的答案显示报告问题的同时,连回,但仍与VSTO 4.0 SP1无解: https://connect.microsoft.com/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-任务窗格与- WPF的上下文菜单具有焦点,问题

其中一个解决方法是使用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的上下文menus.aspx但这是菜单中的所有WPF代码不是为Winform中的DateTimePicker的解决方案。

瑞普微软连接:

新建项目> Excel 2010中添加 - 在使用TaskPane; 使用Microsoft.Office.Core;

命名空间ExcelAddIn2 {公共部分类的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用户控件,确保Calendar控件的位置朝向用户控件的右下方

public partial class TaskPaneCtrl : UserControl
{
public TaskPaneCtrl()
{
    InitializeComponent();
}
}

在TaskPane类库引用Excel的互操作(例如C:\ Program Files文件X86 \微软的Visual Studio 14.0 \ Visual Studio工具用于Office \ PIA \ OFFICE14 \ Microsoft.Office.Interop.Excel.dll)。

生成解决方案。 评论指出,不工作的部分。 生成解决方案。

现在拖放TaskPaneCtrl到TaskPaneView并取消件事,无法编译。

F5键并单击Calendar控件,现在尽量选择是taskpane区域以外的日期。 没有价值的变化事件触发,它的行为像日历之外的点击!

注:我试过了脱落的控制,但它的活动,请FIRE下降downlist!

Answer 1:

“浮动”的关键问题就在这里。 什么是从来没有一个问题是,你依靠Excel中的消息泵分派Windows消息,使这些控制信息输入做出响应。 这又错在WPF尽可能的WinForms,他们有自己的调度循环中它们被传递到窗口之前过滤消息。 当不使用其各自的调度是出问题的关键事情是这样的东西Tab键和快捷键。

然后一些,这样的问题会用Excel调度消息之前做自己的过滤引起的。 我会在反恶意软件功能猜测,微软是永远的牵挂与Office应用程序搞乱程序。

该解决方案的WinForms是为WPF的解决方法,你需要抽自己的消息循环的相同。 这需要一些手术,的DateTimePicker不会合作,因为它不允许被取消其下落事件已经显示日历,复活。 解决方法是愚蠢的,但有效的,添加一个按钮,你的形式看起来就像在DTP的下拉箭头,并使其重叠箭头,它被点击,而不是箭头。

用于获取该按钮重叠的下拉箭头一些示例代码:

    public Form1() {
        InitializeComponent();
        var btn = new Button();
        btn.BackgroundImage = Properties.Resources.DropdownArrow;
        btn.FlatStyle = FlatStyle.Flat;
        btn.BackColor = Color.FromKnownColor(KnownColor.Window);
        btn.Parent = dateTimePicker1;
        btn.Dock = DockStyle.Right;
        btn.Click += showMonthCalendar;
        dateTimePicker1.Resize += delegate {
            btn.Width = btn.Height = dateTimePicker1.ClientSize.Height;
        };
    }

Click事件处理程序需要显示包含的MonthCalendar一个对话框:

    private void showMonthCalendar(object sender, EventArgs e) {
        dateTimePicker1.Focus();
        using (var dlg = new CalendarForm()) {
            dlg.DateSelected += new DateRangeEventHandler((s, ea) => dateTimePicker1.Value = ea.Start);
            dlg.Location = dateTimePicker1.PointToScreen(new Point(0, dateTimePicker1.Height));
            dlg.ShowDialog(this);
        }
    }

随着CalendarForm形式添加这是无国界的,并只包含的MonthCalendar:

public partial class CalendarForm : Form {
    public event DateRangeEventHandler DateSelected;

    public CalendarForm() {
        InitializeComponent();
        this.StartPosition = FormStartPosition.Manual;
        monthCalendar1.Resize += delegate {
            this.ClientSize = monthCalendar1.Size;
        };
        monthCalendar1.DateSelected += monthCalendar1_DateSelected;
    }

    void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) {
        if (DateSelected != null) DateSelected(this, e);
        this.DialogResult = DialogResult.OK;
    }
}


Answer 2:

猜测:
出现此错误的原因DateTimePicker的表面不会被渲染,直到发送点击消息后。

下一步的回答:
如果可以尝试用一些第三方的日期时间选择器控制测试。 我知道这是不是一个完整的答案,因为我还不知道是否会解决您的问题。

其他可能的答案:调整taskpane以适应控制。 这将挑选出bug,但看起来有点怪异从用户的角度来看。



文章来源: BUG: Cant choose dates on a DatePicker that fall outside a floating VSTO Add-In