[英]Tabpages are jumping when moving them from bottom to top in multiline tabcontrol
我们是一个可拖动的tabpages,其实现类似于How to make TabPages draggable主题中建议的方法。 . 我认为这与我们的更改无关,因为我在一个单独的项目中尝试了纯选项卡控件的建议方法,并注意到完全相同的行为。 有没有人遇到过类似的问题? 有什么合理的解决办法吗? 在我看来,禁止绘图并不是一个好主意,因为那样在选项卡移动的地方就看不到了。
链接到最小可重现示例https://drive.google.com/file/d/122u3jcTmqEOl4LcmLI4n3cEvIlds328B/view?usp=sharing
最底部的选项卡行是活动行。 单击/交换上一行上的选项卡会将整行移动到最下一行。 这就是造成抖动的原因。
如果您沿活动行拖动TabPage
,则可以交换TabPageCollection
的索引位置。 但是,只要涉及上一行选项卡, TabControl
重新排列行。
一种可能的想法是只更改TabPage.Text
属性。 但是,那么每个tab矩形宽度都需要锁定,否则很可能会导致抖动问题。 我在玩文本重命名的想法,代码如下。 如果仅更改文本,还需要更智能地突出显示选项卡,以便目标选项卡突出显示,而源选项卡不再突出显示。 最后,当拖动操作结束时将发生实际交换,这将使源选项卡的行成为活动行(未在代码中完成)。
private static void swapTabPages2(TabControl tc, TabPage src, TabPage dst, DragTabData data) {
TabPageCollection tabs = tc.TabPages;
int n = tabs.Count;
int index_src = tabs.IndexOf(src);
int index_dst = tabs.IndexOf(dst);
if (index_dst >= index_src) {
for (int i = 0; i < index_src; i++)
tabs[i].Text = data.OrigText[i]; // OrigText stores each tab's original Text just before this.DoDragDrop(...) is called
for (int i = index_dst + 1; i < n; i++)
tabs[i].Text = data.OrigText[i];
for (int i = index_src; i < index_dst; i++)
tabs[i].Text = data.OrigText[i+1];
tabs[index_dst].Text = data.OrigTabText;
}
else {
for (int i = 0; i < index_dst; i++)
tabs[i].Text = data.OrigText[i];
for (int i = index_src + 1; i < n; i++)
tabs[i].Text = data.OrigText[i];
for (int i = index_src; i > index_dst; i--)
tabs[i].Text = data.OrigText[i-1];
tabs[index_dst].Text = data.OrigTabText;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.