更改父级时修复锚定

Fix Anchoring when changing parent

我有一个 RichTextBox、一个按钮和一个列表框,锚点设置为顶部、底部、右侧。
每当我更改表单大小然后更改它们的父级(从 TabControl 的一个选项卡到另一个)他们的位置搞砸了。

http://imgur.com/WiQhRJU,FyFIQTL,7K7HMTt,Nqrm20y

第一张图片:调整大小前 ✓
第二张图片:调整大小后 ✓
第三张图片:在不同的标签上调整大小后✖
第四张图:切换回原来的标签页✖

这是我用来更改父项的代码:

private void tabTabs_Selected(object sender, TabControlEventArgs e)
{
    if (tabTabs.SelectedTab == tabChat || tabTabs.SelectedTab == tabCmd)
    {
        lstUsers.Parent = tabTabs.TabPages[tabTabs.SelectedIndex];
        rtbSend.Parent = tabTabs.TabPages[tabTabs.SelectedIndex];
        btnSend.Parent = tabTabs.TabPages[tabTabs.SelectedIndex];
    }
}

这是一种相当不寻常的用户界面制作方式。并不是说它一定是错的,但我认为你遇到了这种设计造成的许多潜在困难之一。

主要问题是您正在为不同的功能重复使用用户界面元素。聊天框变成不同选项卡上的命令框,"send" 按钮将在一个选项卡上发送聊天消息,在另一个选项卡上发送命令,等等。每次切换选项卡时,您都必须非常小心大量的房屋清洁工作并正确进行。听起来太复杂了。

大多数用户界面将使用多个文本框、按钮等设计,每个选项卡对应一个。每个文本框或按钮都有一个用途。如果您需要多个不同元素的外观和行为相似,您可以使用样式、模板或创建您自己的用户控件来帮助实现这一点。

该规则的例外是您的查看者列表。看起来无论您在哪个选项卡上,它总是保持不变。如果是我,我只会有一个查看器列表实例,但我不会将它放在选项卡控件中。我只是将它放在选项卡控件旁边,这样您就可以随时看到它。

我知道我晚了一年,但我在制表符和锚定方面遇到了同样的问题。我是如何修复它的,方法是添加一个包含所有元素的面板并将 Dock 设置为 Fill。然后只需更改该容器面板的父级,它就可以完美运行。事实上,这是一个应该报告给 MS 的错误,但目前这个解决方法效果很好。

编辑:您还可以 reduce/remove 通过双缓冲所有控件(包括选项卡组、选项卡页面、容器面板和容器面板内的所有元素)在更改选项卡时轻弹。