【问题标题】:Right-aligned labels in WinFormsWinForms 中的右对齐标签
【发布时间】:2010-12-14 02:59:21
【问题描述】:

在 WinForms 中右对齐 Label 的最明显方法不起作用:将锚点设置为右上/右下,将 TextAlign 设置为右上。如果文本更改,标签的左坐标保持不变,而不是右坐标(有人可能会说这是一个错误)。

出于这个原因,我一直使用全角TableLayoutPanel 作为右对齐标签。但是,这并不总是很方便,具体取决于相关布局...

那么,我想知道是否还有其他我从未想过的方法可以在 WinForms 中保持标签右对齐?

【问题讨论】:

    标签: .net winforms label


    【解决方案1】:

    一个简单的选择是禁用AutoSize(设置为false)并加大它的大小以便有空闲空间。

    或者,也许使用Dock 而不是仅仅使用Anchor,尽管这具有不同的含义,因此您可能需要将其放在Panel 或类似名称中)。最终,这就像第一个一样 - 首先是过度调整它;所以也许第一个选项更简单。

    【讨论】:

    • 啊,是的,这些也可以根据情况使用。我总是有点担心在其他系统上文本可能不适合垂直,因为第一种方法禁用垂直自动调整大小。关于这是否是一个问题的任何 cmet?
    • 没什么大不了的;当然,WPF 可能有更大的灵活性;-p
    • AutoSize...blerg...您已经有几年没有编写 Windows 应用程序了,而且您会忘记所有这些细微差别。谢谢!
    【解决方案2】:

    如果你设置了表单属性 RightToLeft = yes; 所以你不应该使用 Text Align 属性来设置 Anchor。 试试这个方法:

    Form.righttoleft = yes;
    label.anchor = Top, Right;
    label.TextAlign = TopLeft;
    

    Form.righttoleft = No;
    label.anchor = Top, Right;
    label.TextAlign = TopRight;
    

    Form.righttoleft = yes;
    label.righttoleft = No;
    label.anchor = Top, Right;
    label.TextAlign = TopRight;
    

    【讨论】:

      【解决方案3】:

      使用带有停靠标签的 TableLayoutPanel 是我发现在 Winforms 中放置右对齐标签的唯一可靠方法。关闭 AutoSize 并使用超大标签似乎会给高 DPI 用户带来奇怪的异常情况。

      【讨论】:

      • 我尝试了 TableLaoutPanel,正确对齐一个标签很可惜,但如果能正常工作,那就太好了。然而,文本一直换到下一行,对我有什么建议吗?
      【解决方案4】:

      使用 FlowLayoutPanel 效果很好。

      flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
      flowLayoutPanel2.Controls.Add(label);
      

      然后,只需确保 flowLayoutPanel 足够大,以便标签展开即可。

      【讨论】:

        【解决方案5】:

        这是对我有用的标准表单

        • 将 AutoSize 属性设置为关闭,以使标签右对齐
        • 使用布局工具栏使所有字段的大小相同(也许这不是真正需要的)
        • 多选标签并使用布局工具栏将它们右对齐,放置在所需位置
        • 将 TextAlign 属性设置为 xxxRight 设置之一,例如 TopRight

        【讨论】:

          【解决方案6】:

          对我来说最好的解决方案是:

          1. 将 AutoSize 属性标签设置为 false。设置 TextAlign
          2. 右侧某物的属性标签。
          3. 手动调整 逐个标记,以便他们可以使用更多空间。

          【讨论】:

            【解决方案7】:

            将事件处理程序附加到标签的 SizeChanged 事件:

            private void label1_SizeChanged(object sender, EventArgs e)
            {
                label1.Location = new Point(Your_Anchor_Point - label1.Width, label1.Location.Y);
            }
            

            为了对 DPI 更友好,考虑使用其他控件作为锚点,即

            label1.Location = new Point(dataGridView1.Location.X + dataGridView1.Width - label1.Width, label1.Location.Y);
            

            与 dgv 的右侧对齐。

            (顺便说一句:我尝试了 Paint & TextChanged 事件,但它们似乎有时会感到困惑 - 可能与事件顺序有关,尤其是在打开新表单时。)

            【讨论】:

              【解决方案8】:

              Sphax 注意到您必须:

              1. AutoSize设置为false
              2. TextAlign 设置为右,例如设置为MiddleRight
              3. 使用MeasureString将标签调整为实际大小

              代码:

              label.AutoSize = false; 
              label.TextAlign = ContentAlignment.MiddleRight;    
              
              int yourWidthHere = 100;    
              using (Graphics g = label.CreateGraphics())    
              {    
                   SizeF size = g.MeasureString(text, label.Font, yourWidthHere);    
                   label.Height = (int)Math.Ceiling(size.Height);    
                   label.Text = text;    
              }   
              

              【讨论】:

                【解决方案9】:
                • 动态创建标签的默认自动大小为 false。
                • 如果标签的自动大小为假。它包含额外的空白空间。
                • 欺骗您认为它没有正确对齐。诊断它, 将标签的 backColor 设置为浅绿色

                 int rowIndex=1;
                
                 var lbx = new Label();
                 lbx.AutoSize = true;          // default is false.
                 lbx.BackColor = Color.Green;  // to see if it's aligning or not
                 lbx.Text = "Iam  Autosize=true";
                 lbx.Anchor = AnchorStyles.Right;
                 tlPanel.Controls.Add(lbx, 0, rowIndex);
                
                 var dtp = new DateTimePicker();
                 dtp.Anchor = AnchorStyles.Left;
                 tlPanel.Controls.Add(dtp, 1, rowIndex);
                
                
                  //--- row 2  autosize false
                 rowIndex=2;
                  var lbx2 = new Label();
                 lbx2.AutoSize = false;          // default is false.
                 lbx2.BackColor = Color.Green;  // to see if it's aligning or not
                 lbx2.Text = "AutoSz=false";
                 lbx2.Anchor = AnchorStyles.Right;
                 tlPanel.Controls.Add(lbx2, 0, rowIndex);
                
                 var dtp = new DateTimePicker();
                 dtp.Anchor = AnchorStyles.Left;
                 tlPanel.Controls.Add(dtp, 1, rowIndex);
                

                【讨论】:

                  猜你喜欢
                  • 2010-11-08
                  • 2017-11-28
                  • 2012-08-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-16
                  相关资源
                  最近更新 更多