【问题标题】:TabControl ItemSize with TabPage ImageKeyTabControl ItemSize 与 TabPage ImageKey
【发布时间】:2018-06-08 22:04:11
【问题描述】:

我有一个TabControl,我想将标签保持在固定大小,并且我想要标签中的图标。我设置了TabControl.SizeMode = FixedTabControl.ItemSize = 100, 18。我还设置了TabControl.ImageList 并通过TabPage.ImageKey 将图像分配给选项卡。

如果我注释掉分配ImageKey,这就是它的样子:

如果我分配ImageKey,这就是它的样子:

图标是否有某种“对齐”?我希望它们位于空白区域的最左侧,而是从文本开始的位置开始。有什么建议吗?

(顺便说一句 - 如果我设置 TabControl.SizeMode = Normal,我会按照我想要的方式获取标签内容,但标签不是固定大小):

【问题讨论】:

  • 据我所知,没有直接的方法可以做到这一点,除非您通过 tabControl 中的 DrawItem 事件自己绘制项目。
  • TabControl 的视觉样式渲染器长期以来一直是臭名昭著的错误。是的,看起来他们在 Win10 秋季创作者版中又搞砸了。一种解决方法是仅禁用选项卡控件的视觉样式,而不禁用选项卡页或 UI 的其余部分。 stackoverflow.com/a/299983/17034

标签: c# winforms tabcontrol


【解决方案1】:

我可以使用TabControl.SizeMode = Fixed(在 Windows 10 上)验证您看到的问题。我最初在设计器中看到它是在配置带有图标的TabPage 时。然而令人恼火的是,如果设计师关闭并重新打开,问题就会自行纠正。这表明了某种窗口样式设置,并且基于SizeMode 属性在CreateParams Property 中设置了一些Tab Control Styles。但是,我在尝试应用 TCS_FORCEICONLEFT 样式时没有找到解决方案。如果在显示控件之前设置了ImageIndex 属性,则对齐方式符合要求。所以我认为在句柄创建时必须配置一些东西。

如果在设置 TabPage.ImageIndex 属性后调用表单的 RecreateHandle 方法,表单将重绘并且一切正常。然而,这会导致表单闪烁。在 TabControl 上调用 Control.RecreateHandle 方法也可以。这是一个受保护的方法,需要使用派生的 TabControl 来公开该方法,或者您可以使用反射来调用该方法。

public class MyTC : TabControl
{
    public void FixIcon()
    {
        RecreateHandle();
    }
}

【讨论】:

  • 你可以有同样的效果(在你分配了ImageList和项目ImageIndex之后),设置:tabControl1.SizeMode = TabSizeMode.Normal;和紧随其后:tabControl1.SizeMode = TabSizeMode.Fixed;(在我可以测试的环境中- Win10 Fall Creators edition 不包括在内)。
  • 与@Jimi 的想法类似 - 它实际上对我来说只需在设置@987654336 后设置tabControl.ItemSize = new Size(100, 18);(与设计器中设置的大小相同)再次 @
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2010-10-07
相关资源
最近更新 更多