首页 > 解决方案 > C# TabPage ImageIndex 更改

问题描述

所以,我正在使用其他人的代码,我一直看到这种事情:

if (page.ImageIndex != 2)
{ 
    page.ImageIndex = 2; 
}

现在,从逻辑的角度来看,这似乎没有意义,所以我想知道当您更改他们不想触发的图像时是否会触发某种事件(我已经搜索过一个但是我没有看到 - 我看到了BackgroundImageChanged,但这似乎是别的东西),或者如果可能设置一个ImageIndex值,即使它相同,也会导致闪光或闪烁,或其他什么?

只是想知道我错过了什么。

谢谢大家!

标签: c#tabpage

解决方案


更改 Windows 窗体控件的 ImageIndex 有时会产生意想不到的副作用。

您可以在这篇文章中看到类似的问题,其中 OP 在树视图中遇到节点意外崩溃

设置 SelectedImageIndex 时树视图中奇怪的自动折叠行为?

例如,对于 TreeView,更改 SelectedImageIndex 会导致整个树视图创建一个新的窗口句柄、重新绘制,并且还会折叠除包含相关节点的节点之外的所有节点。

这里可能发生了同样的事情,检查 TabPage ImageIndex setter 的源代码可以确认这一点,因为它会导致整个选项卡控件的重绘:

https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/TabPage.cs,cec4a25e4fa0d595

set_ImageIndex() => UpdateParent() => parent.UpdateTab() => TabControl.UpdateTabSelection() 

https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/TabControl.cs,1b31148fc95aa30d

因为,当然,框架必须涵盖所有内容:

// After changing the Bounds of TabPages, we need to
// make TabPages Redraw.
// Use Invalidate directly here has no performance
// issue, since ReSize is calling low frequence.
tabPages[index].Invalidate();

推荐阅读