代码之家  ›  专栏  ›  技术社区  ›  Roman Starkov

WinForms中的右对齐标签

  •  40
  • Roman Starkov  · 技术社区  · 16 年前

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

    因此,我一直使用全宽 TableLayoutPanel 用于右对齐标签。然而,这并不总是非常方便,取决于所讨论的布局…

    所以,我想知道是否还有其他方法可以让WinForms中的标签保持正确的对齐,而这在我看来从未发生过?

    9 回复  |  直到 8 年前
        1
  •  50
  •   Marc Gravell    16 年前

    一个简单的选项是禁用 AutoSize (设置为 false )而且尺寸过大,所以有多余的空间。

    或者,可以使用 Dock 而不仅仅是 Anchor ,尽管这有不同的含义,因此您可能需要将其放入 Panel 或类似的)。归根结底,这就像第一种方法——首先对其进行过大的调整;因此,第一种方法可能更简单。

        2
  •  9
  •   Damien    16 年前

    使用带有停靠标签的TableLayoutPanel是我在WinForms中放置右对齐标签的唯一可靠方法。关闭自动调整大小和使用过大的标签似乎会导致高dpi用户出现奇怪的异常情况。

        3
  •  8
  •   Aaron Deming    13 年前

    使用flowlayoutpanel可以很好地工作。

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

    然后,只要确保flowlayoutpanel足够大,标签就可以展开。

        4
  •  7
  •   Steve Czetty Wilko van der Veen    13 年前

    这是我的标准表格

    • 将“自动调整大小”属性设置为“仅使标签右对齐”
    • 使用布局工具栏使所有字段的大小相同(也许这不是真正需要的)
    • 多选标签并使用布局工具栏右对齐它们,在需要的位置
    • 将TextAlign属性设置为XXXRight设置之一,例如,右上角
        5
  •  1
  •   Community Mohan Dere    8 年前

    以及作为 Sphax 注意到你必须:

    1. 集合 AutoSize
    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;    
    }   
    
        6
  •  0
  •   Wael Dalloul    16 年前

    如果将窗体属性rightToLeft设置为yes; 所以您不应该使用文本对齐属性,只需设置锚定。 尝试以下方法:

    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;
    
        7
  •  0
  •   Sphax    12 年前

    对我来说最好的解决办法是:

    1. 将“自动调整大小”属性标签设置为“假”。设置文本对齐
    2. 属性标签指向右侧的某个内容。
    3. 手动调整大小 标签1乘1,这样他们可以使用更多的空间。
        8
  •  0
  •   Rob    11 年前

    将事件处理程序附加到标签的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事件,但它们有时似乎会混淆-可能与事件顺序有关,特别是在打开新表单时。)

        9
  •  0
  •   bh_earth0    8 年前
    • 动态创建的标签的默认自动调整大小为假。
    • 如果标签的自动调整大小为假。它包含额外的空白空间。
    • 这让你觉得它没有正确对齐。为了诊断它, 将标签背景色设置为浅绿色

    enter image description here

     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);
    
    推荐文章