【问题标题】:Placing a Label top-center of a Listview in winforms在winforms中放置一个Listview的标签顶部中心
【发布时间】:2018-11-27 07:30:12
【问题描述】:

我正在用 winforms 开发一个软件,我被困在一个步骤中,我有一个标签放在 ListView 的顶部。

在程序运行期间,Label 的文本发生了变化。文本的长度可以是 loger 或更短。

例如,它可能一次是“你好”,下一次是“你好,我的名字是……”。

我的问题是,是否可以根据表单中 ListView 的位置放置标签?

我希望标签始终位于 Listview 的顶部中心。

如下图所示:

                       Label
  [                   ListView                     ]

文字变化:

                       Hello
  [                   ListView                     ]

文字变化:

                 Hello My Name is Omar
  [                   ListView                     ]

我尝试将 Label 的 AutoSize 属性设置为 False,将 TextAlign 属性设置为 MiddleCenter,将 Dock 属性设置为 Fill。这对我不起作用,因为一旦我这样做了,一旦我运行该软件,我的表单中就会消失一些图片。

【问题讨论】:

  • AutoSize 设置为false,将TextAlign 设置为MiddleCenter,并使标签与ListView 一样宽,或者将Dock 之类的设置为Fill。这够了吗?
  • @Equalsk,感谢您的回答。实际上我已经尝试过了,但是在 ListView 旁边我有一些图片框。如果我将 Dock 设置为填充,则图片框不再可见。
  • 你可以试试Anchor,或者设置PictureBox也有合适的DockStyle

标签: c# winforms listview label


【解决方案1】:

您可以利用 Designer 来满足需求,而无需在设计时编写代码:

使用文本居中对齐的标签

  • LabelListView 放在同一个容器中。
  • LabelTextAlign 属性设置为MiddleCenter
  • LabelAutoSize 属性设置为false
  • LabelDock 属性设置为Top
  • ListViewDock 属性设置为Fill

使用 TabelLayoutPanel

  • 使用带有两行的TableLayoutPanel
  • Label 放在第一行并将其Anchor 设置为无。
  • LabelAutoSize属性设置为默认设置的true
  • ListView 放在第二行,并将Anchor 设置为上、左、下和右。

【讨论】:

  • 我使用面板作为容器,按照您的建议进行操作,效果很好!谢谢。
【解决方案2】:

这很容易。 就在label TextChanged事件中,根据listView Location、Width和label Width重新定位label位置,计算差值除以2得到居中。

private void label1_TextChanged(object sender, EventArgs e)
        {
            label1.Location = new Point((listView1.Location.Y +listView1.Width - label1.Width) / 2, 
            label1.Location.Y);

        }

当标签中的文本发生更改时,这将使标签居中于 listView,因此它始终居中。

当然,如果您想更改 Y 位置,您可以将 Location.Y 更改为您想要的任何点。 举个例子:你可以获取listView Location y,然后获取标签Height来定义Y位置。

喜欢:

    label1.Location = new Point((listView1.Location.Y + listView1.Width - label1.Width) / 2,
 listView1.Location.Y - label1.Height -10);

这将计算 Y 轴上的 listView 位置并获取标签高度,然后添加 10 个空格。这将使标签位置保持在 listView 的顶部 +10,因此如果标签变为两行或 n 行,它'会一直在listView的顶部,不会互相覆盖

结果如下:

【讨论】:

  • 您提供的代码没有将标签放在 ListView 的顶部中心,实际上它在我的 ListView 的左上角。
  • 不,它在中心,因为我们正在计算两者的宽度,然后计算差值并将其 除以 2 这将使标签保持在中心!我会尝试将结果添加为 Gif
  • 嗯,你是对的,我忘了计算位置。更新我的答案,立即尝试
  • 其实标签第二次变化的时候,已经不在中心了。
  • 是的,我有!在私有 void label1_TextChanged(object sender, EventArgs e)
猜你喜欢
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多