【问题标题】:Get ListBox Displayed Height获取 ListBox 显示高度
【发布时间】:2009-05-08 18:01:31
【问题描述】:

有没有办法确定 Windows 窗体列表框的显示高度?在我正在开发的应用程序中,我有一个带有停靠在其中的 ListBox 的表单。我需要自动调整表单的大小以删除由于 ListBox.IntegralHeight 设置为 true 而 ListBox 未使用的底部的任何额外空间。目前我正在使用 Form.Height 除以 ListBox.ItemHeight 来调整 Form 的大小,然后将该值乘以 ListBox.ItemHeight 以四舍五入多余的不必要高度。


this.Height = (this.Height / this.listBox.ItemHeight) * this.listBox.ItemHeight; 

这在 Vista 中效果很好,但是当我将我的应用程序带到 XP 时,出现了问题,并且表单底部仍然显示了额外的空间。

我不能使用 ListBox.PreferredHeight,因为这只会给我显示所有项目时 ListBox 占用的空间量。

【问题讨论】:

    标签: .net winforms listbox


    【解决方案1】:

    我的问题已经解决了。

    我发现ListBox.Height返回ListBox的显示高度,甚至如果停靠。这回答了我的问题,但不是我的问题的解决方案。

    进一步的调试揭示了为什么表单在 Vista 上的大小正确,而在 XP 上却不正确。我自己绘制的 ListBox 的 ItemHeight 是 16 像素(因为我为每个项目绘制 16x16 的图像),并且 ListBox 是没有标题栏的单边框形式。碰巧 Vista 上的边框高度加起来为 16px(项目的高度),而 XP 上的边框高度加起来为 8px。我的高度计算正确的,但问题是我设置了 Form.Height(表单的整个高度,包括边框)而不是 Form.ClientSize(只是没有边框的内部区域)。因此,在 Vista 上我丢失了一个项目,而在 XP 上,列表框下方的额外空间是边框没有占用的 8 个剩余像素。我最初发布的问题代码现在变成了:

    
    this.ClientSize = new Size(
        this.ClientSize.Width, 
        (this.ClientSize.Height / this.listBox.ItemHeight) * this.listBox.ItemHeight);
    
    

    这会将客户区高度四舍五入到最近的项目,并且有利于限制调整表单的大小。

    如果我只想缩小表单以适应 ListBox,代码可以简化为:

    
    this.ClientSize = new Size(this.ClientSize.Width, this.listBox.Height);
    
    

    【讨论】:

      【解决方案2】:

      我认为

      System.Windows.Forms.SystemInformation.Border3DSize.Height
      

      在这种情况下确实可以帮助您,因为它会告诉您边框高度

      【讨论】:

        【解决方案3】:

        根据您的应用,最好将列表框放置在适当的容器中以进行布局。只是一个建议,并不是对您的 Q 的真正回答。

        当然,您可以考虑通过上述容器代码进行反映,以了解它们如何获得包含控件的大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-22
          • 2023-02-07
          • 1970-01-01
          • 2010-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多