【问题标题】:Keeping one window in front of another将一扇窗户放在另一扇窗户前面
【发布时间】:2009-11-13 14:46:50
【问题描述】:

我正在编写一个用户控件,它的行为有点像下拉列表,基本上是一个文本框,其下方会弹出一个列表框...

如果控件位于其父窗体的底部,我不希望列表框被窗体底部剪切,所以据我所知,我不能只将此列表框作为父窗体的子窗体。我需要创建一个包含列表框的新无边框表单并将其显示在正确的位置。

我可以做到这一点,问题在于整理表格的 z 顺序。我需要这个新表单始终出现在父表单上方。但我不希望这个窗口出现在父窗体上方的任何窗口之上......这是设置 form.TopMost 会给我的。

还有其他方法可以做到这一点吗? ComboBoxes 如何实现这种行为?

谢谢

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    当您调用form.Show() 时,将用户控件的所有者(当前窗体)作为所有者参数传入。这段代码并不完美,但你会明白的。

    class MyControl : UserControl
    {
        private DropDownForm form = new DropDownForm();
    
        public MyControl()
        {
            form.FormClosed += dropdownform_closed;
        }
    
        private void MethodThatShowsDropdown()
        {
            form.AddData(GetTheData());
            form.Show(this.Owner); // Or is it "this.Parent"?  I can never remember...
        }
    
        private void dropdownform_closed(object sender, EventArgs e)
        {
            DoSomething(form.SelectedValue);
        }
    }
    

    【讨论】:

    • 此外,您可以在表单上设置 Owner 属性,以防您的代码没有直接显示它。
    • 当我运行这段代码时,表单只是出现又消失。为什么不只是(new DropDownForm()).Show(this)
    • Eek - 哎呀。该表单正在立即处理(并因此关闭)。我将更改示例...
    【解决方案2】:

    我不确定它是否适用于您的应用程序,但使用ShowDialog() 显示您的“列表表单”会使其保持在正确的位置。缺点是当列表打开时它不允许你返回到父窗体。

    【讨论】:

      【解决方案3】:

      您应该只需要在调用 ShowModalDialog 或 Show 时提供父窗体。当您执行此操作时,表单是第一个表单的子表单,并且始终会在 z 顺序中与其重叠。

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多