【问题标题】:Tool Strip (ToolStripDropDownButton) close and lose window focus工具条 (ToolStripDropDownButton) 关闭并失去窗口焦点
【发布时间】:2012-12-04 20:55:41
【问题描述】:

我有一个带有 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

【问题讨论】:

    标签: .net vb.net winforms windows-7


    【解决方案1】:

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

        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);
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 除了 ToolStripDropDownButton,还有其他控件可以给我类似的东西吗? (从菜单项打开自定义控件)
        • 表单是合乎逻辑的选择。
        猜你喜欢
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多