用户控件锚定属性问题

6

背景:

我创建了一个“用户控件”(User Control)。由于某种原因,我想在不同的尺寸中使用此控件。为了在重新调整大小时保持我的“用户控件”的初始“模板”,我在控件内部的不同元素上使用了Anchor属性。

因此,在设计时创建控件时,我可以手动调整控件的大小并保持其原始“模板”。

控件创建后,它看起来像这样:

Initial

调整大小后如下所示:

Re-Sized

正如您所看到的,Anchor属性运作良好。

  • 标签和图片保持在中间。
  • “?”停留在左上角。

问题:

我遇到的问题是,当控件以与初始大小不同的尺寸重新加载时,所有元素都返回到其初始位置:

Problem

我不知道是否这是实现我的目标的更好方式。请记住,我在设计时添加和调整控件的大小。

谢谢。

编辑:

我认为我的问题是由设计器引起的。例如:我在设计器中添加了我的控件,然后重新调整大小,运行解决方案。一切都很好。但是当我进入页面的代码,然后返回到设计器时,控件内部的元素将返回到其初始位置。

编辑2:

好的,我找到了一个解决方法,我只需将“用户控件”的所有元素移动到一个Panel中。出于某种我无法解释的原因,它完美地工作。控件保持在相同的位置。


你可以使用ResizeEnd事件来将ResizeBegin中使用的相同属性应用。当你说重新加载时,是指控件获得了一个完全新的实例吗?如果是这样,它应该始终调用InitializeComponent,以应用在设计器中定义的属性。 - Francis.Beauchamp
我不确定应该尝试什么,因为我的问题似乎是在设计师中引起的。例如:我在设计师中添加了控件,重新调整了大小,运行解决方案,一切都正常。但是当我转到页面的代码,然后返回到设计师时,控件内部的元素会返回到它们的初始位置... - Vinc 웃
1
这太模糊了。你需要解释一下控件是如何"重新加载"的,但不再使用原始设计大小。以及为什么在控件加载后发出的正常PerformLayout()调用不再被执行。 - Hans Passant
使用调试器来验证控件重新加载后 Anchor 属性的值。此外,Dock 属性会覆盖 Anchor 属性,因此您也需要验证它。 - Francis.Beauchamp
好的,我现在正在看这个,谢谢。 - Vinc 웃
正如您所看到的,我已经找到了解决问题的方法,感谢您的帮助。 - Vinc 웃
4个回答

5
解决方案是在用户控件中添加一个“面板”,并将其停靠在“填充”位置,然后将元素放置在此面板内。由于某些我无法解释的原因,设计师保留了重新调整大小的控件元素的位置。

我回答了我的问题,以帮助那些可能遇到和我一样问题的人。如果你能提供更好的解决方案,请毫不犹豫地编辑我的答案。 - Vinc 웃

3
用户控件的定位、停靠和自适应大小似乎令人困惑。我在“UserControl does not auto resize with the Form”上找到了一篇文章,建议将AutoSize属性设置为False,我按照这个方法尝试了一下,但是并没有解决我的问题。但当我采用你的解决方案时,我还注意到有两个AutoSize属性!我已经在用户控件设计器中将AutoSize设置为False,但是在添加用户控件实例的窗体设计器中,也有一个AutoSize,它的值与之前不同(仍为True)。当我将其也设置为False后,一切都正常了(包括面板)。然后我删除了你建议的面板,一切仍然正常。所以,关键是确保您在用户控件设计器使用控件的表单设计器中检查所有属性。然后你就不需要一个面板了。

1

我在VS2015项目中遇到了类似的问题,不幸的是,你们的答案都没有帮助到我。我在这里,在Jignesh Thakker的回答中找到了一个有效的解决方案。

为了更快地导航,这就是我在我的项目中(c++/cli,而不是c#)所做的方式:

System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
/* some code */

myUserControl = gcnew MyUserControl();
myUserControl->Dock = DockStyle::Fill;

tabPage1->Dock = DockStyle::Fill;
tabPage1->Controls->Add(myUserControl);

/* some code */

}

0

在VS设计器中将父窗体的Localizable属性设置为false。这样可以解决设计时的问题。(切换属性后保存、关闭并重新打开窗体)

如果您需要本地化应用程序,请在完成布局工作后将Localizable属性切换为true,不要关心在VS设计器中的奇怪表示。在运行时它会正确显示。

在VS2013中测试过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接