Anchor和Dock属性在WinForms中是否互斥

本文关键字:是否 WinForms Dock 属性 Anchor | 更新日期: 2023-09-27 18:00:05

Dock属性似乎可以用acnhoring来实现,例如listBox.Dock = DockStyle.Left;相当于(在我的小测试项目中):

listBox.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom;
listBox.Height = form.ClientSize.Height;

此外,您可以将锚点设置为AnchorStyles.Right,这将与DockStyle.Left相矛盾。

所以我做了一些测试,似乎更改Dock会重置Anchor,反之亦然:

Action Print = ()=>Console.WriteLine("Anchor: " + listBox.Anchor + ";; Dock: " + listBox.Dock);
listBox.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom;
Print();
listBox.Dock = DockStyle.None;
Print();
listBox.Dock = DockStyle.Right;
Print();
listBox.Anchor = AnchorStyles.Left | AnchorStyles.Top;
Print();
listBox.Anchor = AnchorStyles.Left;
Print();

这是输出:

锚点:顶部、底部、左侧;;停靠:无锚点:顶部、底部、左侧;;停靠:无锚点:顶部,左侧;;停靠:右侧锚点:顶部,左侧;;停靠:右侧锚点:左;;Dock:无

因此,我假设这意味着AnchorDock互斥,并且只有当Dock属性设置为None时才考虑Anchor属性。

这是正确的吗?

Anchor和Dock属性在WinForms中是否互斥

它们确实具有排他性。在属性面板中,当您固定控件时,它会忘记定位设置,而当您固定它时,它也会忘记固定设置。但是,在某些情况下,您可能需要两者的组合。假设你有一个隐藏的底部停靠进度条,当执行长任务时,你想向上推一个底部停靠的数据网格视图。但是,当显示进度条时,您希望保持datagridview的顶部锚点。解决方案是在锚定的面板中放置一个底部停靠的进度条和一个完全停靠的数据网格视图(按此顺序)。

从逻辑上讲,同时使用它们没有任何意义。Anchor说"与指示的边缘保持一定距离",Dock说"填满这条边缘的所有空间"。

相关文章: