C# 用户控件锚属性问题
上下文: 我创建了一个C# 用户控件锚属性问题,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,上下文: 我创建了一个用户控件。出于某种原因,我想使用不同大小的控件。要在重新调整大小时保留我的用户控件的初始“模板”,我在控件内的不同元素上使用属性锚定 因此,当我在设计时创建控件时,我可以手动重新调整控件的大小,并保留控件的原始“模板” 创建控件时,其外观如下所示: 重新调整尺寸后: 如您所见,属性锚定运行良好 标签和图片保持在中间。 “?”号留在左边的拐角处 问题: 我遇到的问题是,当重新加载控件时,创建的控件的大小与初始控件的大小不同,其中的所有元素都会返回到其初始位置: 我不
用户控件
。出于某种原因,我想使用不同大小的控件。要在重新调整大小时保留我的用户控件的初始“模板”,我在控件内的不同元素上使用属性锚定
因此,当我在设计时创建控件时,我可以手动重新调整控件的大小,并保留控件的原始“模板”
创建控件时,其外观如下所示:
重新调整尺寸后:
如您所见,属性锚定运行良好
标签和图片保持在中间。
- “?”号留在左边的拐角处
问题:
我遇到的问题是,当重新加载控件时,创建的控件的大小与初始控件的大小不同,其中的所有元素都会返回到其初始位置:
我不知道这是不是更好的方式来实现我的目标。请记住,我在设计期间添加并重新调整了控件的大小
多谢各位
编辑:
我想我的问题是设计师造成的。例如:我在设计器中添加控件,重新调整其大小,运行解决方案。一切正常。但是当我转到页面的代码,然后返回到设计器时,控件中的元素返回到它们的初始位置
编辑2:
好的,我找到了一个解决方案,我只是将用户控件的所有元素移动到面板中由于一些我无法解释的原因,它工作得非常好。控件保持在同一位置 解决方案是将面板
添加到用户控件
并将其停靠到“填充”位置,然后将元素放置在此面板内。由于某些我无法解释的原因,设计者保留了重新调整大小的控件元素的位置。用户控件的锚定、停靠和自动调整大小似乎令人非常困惑。我发现这表明您将AutoSize
属性设置为False
,我这样做了,但它仍然没有纠正我的问题。但是当我尝试您的解决方案时,我还注意到有两个AutoSize
属性的副本!我已经将UserControl designer中的AutoSize
设置为False
,但是添加UserControl实例的表单设计器在实例上也有一个AutoSize
,并且这个值不同(仍然是True
)。当我也将其设置为False
时,一切正常(面板就位)。然后我拆下了你建议的面板,一切仍然正常。因此,我想诀窍是确保在UserControl designer中检查UserControl的所有属性,并在使用控件的窗体设计器中检查UserControl的所有属性。那么您就不需要面板了。在VS designer中将父窗体的Localizable属性设置为false。这在设计时解决了问题。(切换属性后保存、关闭并重新打开表单)
如果需要本地化应用程序,请在完成布局工作后将Localizable属性切换为true,而不必关心VS设计器中的有线表示。在运行时,它被正确显示
在VS2013中测试我在VS2015项目中遇到过类似的问题,不幸的是,您的答案都没有帮助。找到了干净且有效的溶液。
为了更快地导航,这里介绍了在我的项目中是如何完成的(c++/cli,不是c#,但想法是一样的):
您可以使用ResizeEnd事件应用它们在ResizeBegin中使用的相同属性。当你说重新加载时,是不是控件得到了一个完整的新实例?如果是这样的话,它应该总是调用InitializeComponent来应用设计器中定义的属性。我不确定该尝试什么,因为我的问题似乎是设计器中的原因。我在设计器中添加控件,重新调整大小,运行解决方案。一切正常。但是当我转到页面的代码,然后返回到设计器时,控件中的元素返回到它们的初始位置……这太模糊了。您需要解释该控件是如何“重新加载”的,但不再使用其原始设计大小。以及为什么不再进行加载控件后发出的正常PerformLayout()调用。重新加载控件后,请使用调试器验证该控件的锚定值。此外,Dock属性会覆盖Anchor属性,因此您也必须验证这一点。好的,我现在正在查看这一点,谢谢。我回答了我的问题,以帮助任何与我有相同问题的人。如果你能给出一个更好的解决方案,请不要犹豫编辑我的答案。
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 */
}