【问题标题】:Winforms C#: Scrolling changes location of my buttons?Winforms C#:滚动更改按钮的位置?
【发布时间】:2014-04-10 09:12:21
【问题描述】:

我正在做一个关于 winforms 的项目,我最近意识到如果我向下滚动然后导致另一个按钮出现,它会出现在与我的意思不同的位置。我需要知道如何解决这个问题,我的意思是如何让按钮出现在整个表单的某个位置。

我有两个按钮,一个让另一个出现 下面是一个代码示例:

public Form1()
{
    InitializeComponent();
    this.AutoScroll = true;
    this.Controls.Remove(button2);
}

private void button1_Click(object sender, EventArgs e)
{
    this.button2.Dock = DockStyle.None;
    this.button2.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
    this.button2.Location = new System.Drawing.Point(110, 96);
    this.Controls.Add(button2);
}

private void button2_Click(object sender, EventArgs e)
{
    this.Controls.Remove(button2);
}

它不起作用。

【问题讨论】:

  • 查看按钮上的 Anchor 属性。
  • 它需要在一个非常具体的地方
  • 我明白了,但你有什么尝试?
  • 我试过做anchor和dock,就像我之前说的,它不起作用
  • 那么您需要提供更多信息,在这种情况下可能还需要提供您的 UI 屏幕截图。我们不知道您的 UI 是什么样的。

标签: c# winforms scroll location


【解决方案1】:

按照 scheien 的建议,将按钮的位置设置为所需的位置,并将 Anchor 属性设置为所需的值(左、上、右、下)。这将固定按钮相对于所选表单边缘的位置。

如果您的意思是即使用户滚动并阅读某些文本时也不希望按钮移动,请将按钮放在面板中并将面板停靠在表单底部(或任何您想要的位置)。您还可以使用拆分器控件并将按钮放在一个部分中,将内容放在另一个部分中。

【讨论】:

  • 我试过了。 this.options.Anchor = (AnchorStyles.Top); this.options.Location = new System.Drawing.Point(x - 90, y + 80);但它不起作用,按钮仍然移动。
  • 那是因为您只将它固定到 Top。您需要将其固定到您希望按钮固定的所有边缘。也许像 button.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
  • 我看到了你的代码 sn-p。这里的问题是设置停靠栏和锚点是没有意义的,直到窗口实际呈现控件。我建议您在表单加载时创建两个按钮,并使其中一个不可见,而不是从 Controls 集合中删除它们。在每个按钮单击处理程序上切换两个按钮的可见性。您可以使用 button.Visible 属性。
【解决方案2】:

将按钮上的 Anchor 属性设置为 Top, Left 。那么它与顶部和左侧的距离总是相同的。这也是默认设置。

确保Dock 属性设置为None:

        button1.Dock = DockStyle.None;
        button1.Location = new System.Drawing.Point(50, 50);
        button1.Anchor = (AnchorStyles.Top | AnchorStyles.Left);

当您将按钮添加到表单时,它会从顶部开始绘制 50 像素,从左侧绘制 50 像素,根据持有它的控件。在这种情况下,形式:

this.Controls.Add(button1);

您确定 x 和 y 变量没有弄乱位置吗?

【讨论】:

  • 我试着把它们改成数字还是不行
【解决方案3】:

请让自己更清楚:您写的是您滚动表单,对吗?

正常行为是每个控件,包括所有按钮,都会随之移动。

这是你的问题还是正在发生另一个“运动”?

由于之前的回答没有帮助,这里有一个解决固定按钮(有点异国情调)情况的解决方案:

首先创建表单变量来保存原始的 Top 值:

int oldButton1Top;

然后在Load事件中设置:

public Form1()
{
   InitializeComponent();
   //..
   oldButton1Top = button1.Top;
   //
}

然后像这样对表单的滚动事件进行编码:

private void Form1_Scroll(object sender, ScrollEventArgs e)
{
   button1.Top = oldButton1Top + e.NewValue - e.NewValue;
}

这应该使您的按钮固定在其原始位置。

顺便说一句:在一个答案中,您被告知在 相对 边缘上将锚点设置为 true。当窗口调整大小时,这将使按钮 grow 或 shrink 并且肯定不是您想要的

【讨论】:

  • 非常感谢......我实际上用另一种方式修复了它,但非常感谢
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多