如何在不闪烁和布局重叠的情况下恢复和最大化表单?

Posted

技术标签:

【中文标题】如何在不闪烁和布局重叠的情况下恢复和最大化表单?【英文标题】:How to restore and maximize a form without flickering and layout overlapping? 【发布时间】:2017-11-26 12:24:31 【问题描述】:

在我的 Windows 窗体应用程序中,我添加了一个 SplitContainer 控件。在 SplitContainer 的 panel1 中,我有一个 ListBox,在 SpliContainer 的 panel2 中,我有两个按钮。在 ListBox 的鼠标移动上,我想选择 ListBox 项。下面是我选择列表框项目的代码,

 private void ListBox1_MouseMove(object sender, MouseEventArgs e)
    
        int i;
        this.SuspendLayout();
        for (i = 0; i < (this.listBox1.Items.Count); i++)
        
            if (this.listBox1.GetItemRectangle(i).Contains(this.listBox1.PointToClient(MousePosition)))
            
                this.listBox1.SelectedIndex = i;
                return;
            
        
        this.ResumeLayout(true);
    

调用 SuspendLayout() 和 ResumeLayout() 以避免表单加载时面板重叠。

如果我恢复表单,将鼠标移动到 ListBox 上并再次最大化表单,则 SplitContainer panel2 中的按钮无法正确加载。如果我删除 Suspend 和 ResumeLayout 恢复和最大化工作正常。我提到了这个 *** query link.

ListBox 没有 Resize 和 dock 属性。那么我不应该调用 SuspendLayout 和 ResumeLayout 吗?有人建议在哪里使用 SuspendLayout/ResumeLayout 以及在哪里不使用?

【问题讨论】:

【参考方案1】:

试试这样:

private void ListBox1_MouseMove(object sender, MouseEventArgs e)


    int newindex = ListBox1.IndexFromPoint(e.Location);
    if (newindex != index) //avoid flickering
    
        int i;
        this.SuspendLayout();
        for (i = 0; i < (this.listBox1.Items.Count); i++)
        
            if (this.listBox1.GetItemRectangle(i).Contains(this.listBox1.PointToClient(MousePosition)))
            

                this.listBox1.SelectedIndex = i;
                index = newindex;
                //return; why return?
            
        
        this.ResumeLayout(true);
    

只需将 index 声明为全局变量即可。

【讨论】:

以上是关于如何在不闪烁和布局重叠的情况下恢复和最大化表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?

如何在不闪烁的情况下调整 Swing JWindow 的大小?

如何在不更改布局的情况下跳过/处理 Tailwind 网格中的空单元格? [关闭]

Android高德地图重叠,切换闪烁

如何在没有节点边缘重叠的情况下进行力导向布局

如何在没有元素重叠的情况下在 java 中使用布局?