5

我有一个带有 ToolStripDropDownButton 的 ToolStrip。这又会弹出一个带有 DateTimePicker 的 UserControl。当我单击日历上的顶部数字(绿色)时,一切正常(用户控件保持打开状态)。当我单击较低日期之一(红色)时,ToolStripDropDown 关闭并且应用程序失去焦点。这导致用户必须双击才能再次打开下拉菜单(一次聚焦应用程序,另一次打开下拉菜单)。

当日历日期不在用户控件的顶部时,就会发生这种情况。如您所见,用户控件在“绿色”日期停止。

我希望这很清楚。这似乎是一个 Windows 错误,因为这发生在一个非常简单的项目中。有没有人看到这个问题?有解决办法吗?

在此处输入图像描述

[更新]

我注意到与下拉相同的事情。

在此处输入图像描述

用户控件很大时不会发生这种情况。

在此处输入图像描述

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    Dim uc As New UserControl1
    Dim cms As New ContextMenuStrip()
    cms.Items.Add(New ToolStripControlHost(uc))
    ToolStripButton1.DropDown = cms

End Sub
4

3 回答 3

4

功能,而不是错误。控件需要知道用户在下拉列表之外单击,以便它可以自动关闭下拉列表。这是通过 Capture 属性在 Winforms 中公开的“鼠标捕获”完成的。捕获鼠标可确保将鼠标消息发送到控件,即使鼠标不再位于控件窗口内。

也许现在发生的事情很明显,您实际上并没有点击日历。显示下拉菜单后,控件将捕获鼠标。单击将重定向到 ToolStripDropDown。当您单击“红色区域”时,它会看到鼠标不再位于下拉列表中,从而关闭下拉窗口。

像这样的下拉菜单实际上只适用于简单的项目,将任何创建顶级窗口的控件放入其中,如 DateTimePicker 或 ComboBox 只是不支持的场景。

于 2012-12-17T20:00:34.203 回答
2

我通过切换 AutoClose 以类似的方式解决了这个问题。以为我会发布代码:

    public class ToolStripDropDownDateTimePicker : DateTimePicker
{
    private bool savedAutoClose;

    /// <summary>
    /// Creates a new ToolStripDropDownDateTimePicker.
    /// </summary>
    public ToolStripDropDownDateTimePicker()
    {

    }

    protected override void OnCloseUp(EventArgs e)
    {
        if (this.Parent != null)
        {
            var dropDownHost = this.Parent.Parent as ToolStripDropDown; // recursive instead?
            if (dropDownHost != null)
                dropDownHost.AutoClose = savedAutoClose; // restore the parent's AutoClose preference
        }

        base.OnCloseUp(e);
    }

    protected override void OnDropDown(EventArgs e)
    {
        if (this.Parent != null)
        {
            var dropDownHost = this.Parent.Parent as ToolStripDropDown; // recursive instead?
            if (dropDownHost != null)
            {
                savedAutoClose = dropDownHost.AutoClose;
                // ensure that our parent doesn't close while the calendar is open
                dropDownHost.AutoClose = false;
            }
        }
        base.OnDropDown(e);
    }
}
于 2014-05-22T12:23:05.847 回答
1

我无法更改应用程序的行为,因此我决定根据控件的事件将表单的 AutoClose 设置为 False 或 True。

于 2012-12-18T20:05:41.020 回答