【问题标题】:Windows Forms label custom control origin changeWindows 窗体标签自定义控件原点更改
【发布时间】:2010-04-13 17:27:57
【问题描述】:

我有一个从标签派生的自定义控件。 我需要将原生控件的位置原点从左上角更改为左下角。

是否有方法或属性可以做到这一点?

【问题讨论】:

  • 您是说您希望 Location 属性指定标签左下角的位置,而不是左上角?
  • 是的,这正是我所需要的。
  • 也许你可以解释一下为什么你想这样做。我们能够为您的问题提出更好的解决方案。
  • 我有一个外部文件,其中包含另一个系统创建的控件的布局数据,该文件位置位置数据基于控件的左下角。我必须读取它并根据文件在确切位置呈现控件。因此,对于文本标签位置 100,100,我需要将 100,100 位置作为控件的左下角。我还需要允许用户乱用屏幕上的控件更改位置,然后根据左下角将所有控件原点保存回文件。

标签: c# winforms controls


【解决方案1】:

TextAlign 属性应该可以满足您的需求。

label.TextAlign = System.Drawing.ContentAlignment.BottomLeft;

如果您试图使Location 属性反映控件的右下角而不是左上角,那么这是不可能的。但是,您可以创建自己的属性:

public Point BottomLeft
{
    get { return new Point(Left, Bottom); }
    set { Location = new Point(value.X, value.Y - Height); }
}

但请记住,如果 Height 属性更改(您必须重新设置它),这将不会保持不变。

【讨论】:

  • 我认为这不会改变控制位置的原点。
【解决方案2】:

如果您想更改 Label.Location 属性的行为,使其指向标签的左下角,您可以在自定义标签中覆盖 InitLayout()

class myLabel : Label
{
    protected override void InitLayout()
    {
        base.InitLayout();
        Location = new Point(Location.X, Location.Y - Height);                
    }
}

这将根据控件的高度向上移动控件。因此,如果您以 (100,100) 开头并且标签高度为 13,那么您将以 (100,87) 结尾,这会将左下角置于 (100,100)。

但这只会在标签添加到容器时发生。如果在将标签添加到容器后更改标签的位置,它将返回到右上角。

您可能会尝试的另一件事是覆盖标签所在容器的LayoutEngine { get; },以便您可以完全控制放置在容器中的任何自定义标签的 Location 属性的解释方式。

【讨论】:

  • 不确定是否有帮助,您正在更改位置。我需要控件的位置指向左下角。因此,如果我将控件添加到位置 (100,100) 的表单中,我需要位置 100,100 作为控件的左下角。
  • 我明白你的意思了。您不希望 Location 的实际值发生变化。我的建议将改变 Location.Y。如果这是一个交易破坏者,您可能必须实现自己的 LayoutEngine,或者弄乱标签的 OnPaint()
  • 但我不确定您是否可以在控件范围之外进行绘制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-09-26
  • 2013-02-23
  • 2017-10-19
  • 1970-01-01
相关资源
最近更新 更多