【问题标题】:User control Anchor property issue用户控制锚属性问题
【发布时间】:2013-05-30 18:03:51
【问题描述】:

上下文:

我创建了一个User Control。出于某种原因,我想以不同的大小使用此控件。为了在重新调整大小时保留User Control 的初始“模板”,我在控件内的不同元素上使用属性 Anchor

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

控件创建后如下所示:

在重新调整大小后:

如您所见,属性 Anchor 运行良好。

  • 标签和图片位于中间。
  • “?”留在左边的角落。

问题:

我遇到的问题是,当控件重新加载时,创建的大小与初始大小不同,里面的所有元素都返回到它们的初始位置:

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

谢谢。

编辑:

我认为我的问题是由设计师造成的。例如:我在设计器中添加我的控件,我重新调整它的大小,我运行解决方案。一切正常。但是当我转到页面的代码,然后,返回设计器时,控件内部的元素又回到了它们的初始位置。

编辑 2:

好的,我找到了解决方案,我只是将User control 的所有元素移动到Panel 中。 出于某种我无法解释的原因,它运行良好。控件停留在同一位置。

【问题讨论】:

  • 您可以使用 ResizeEnd 事件来应用它们在 ResizeBegin 中使用的相同属性。当您说重新加载时,控件是否获得了一个完整的新实例?如果是这样,它应该总是调用 InitializeComponent 来应用设计器中定义的属性。
  • 我不太确定要尝试什么,因为我的问题似乎是设计师的问题。例如:我在我的设计器中添加了我的控件,我重新调整了它的大小,我运行了解决方案。一切正常。但是当我转到页面的代码,然后,返回设计器时,控件内的元素返回到它们的初始位置......
  • 这太模糊了。您需要解释这个控件究竟是如何“重新加载”但不再使用其原始设计尺寸的。以及为什么不再进行加载控件后发出的正常 PerformLayout() 调用。
  • 重新加载后,使用调试器验证您控制的 Anchor 的值。此外,Dock 属性会覆盖 Anchor 属性,因此您也必须验证这一点。
  • 好的,我正在看这个,谢谢。

标签: c# .net winforms user-controls


【解决方案1】:

解决方案是将Panel 添加到User Control 并将其停靠到“填充”,然后将元素放置在此面板内。出于某种我无法解释的原因,设计器保留了调整大小的控件元素的位置。

【讨论】:

  • 我回答了我的问题,以帮助任何与我有同样问题的人。请,如果您能提供更好的解决方案,请不要犹豫编辑我的答案。
【解决方案2】:

UserControl 的锚定、停靠和自动调整大小似乎非常令人困惑。我找到了UserControl does not auto resize with the Form,它建议您将AutoSize 属性设置为False,我这样做了,但它仍然没有解决我的问题。但是,当我尝试您的解决方案时,我还注意到 AutoSize 属性有 两个 副本!我已将 UserControl 设计器中的 AutoSize 设置为 False,但添加了 UserControl 实例的表单设计器在实例上也有一个 AutoSize,并且那个有一个 不同 值(它仍然是True)。当我也将其设置为False 时,一切正常(面板就位)。然后我删除了您建议的面板,一切仍然有效。所以我想诀窍是确保您在用户控件设计器中检查用户控件的所有属性在使用控件的表单设计器中。那么你不应该需要一个面板。

【讨论】:

    【解决方案3】:

    我在 VS2015 项目中遇到过类似的问题,不幸的是 - 你的回答都没有帮助。找到了干净且有效的解决方案here, in Jignesh Thakker answer。 为了在这里更快地导航,我的项目是这样完成的(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 */
    
    }
    

    【讨论】:

      【解决方案4】:

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

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

      在 VS2013 中测试

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 2021-08-12
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多