C# TabPage ImageIndex 改变

C# TabPage ImageIndex change

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

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

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

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

谢谢大家!

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

您可以在此 post 中看到类似的问题,其中 OP 遇到节点及其树视图的意外崩溃

因此,以 TreeView 为例,更改 SelectedImageIndex 会导致整个树视图创建一个新的 window 句柄、重新绘制,并折叠除包含相关节点的节点之外的所有节点。

这里可能发生了同样的事情,检查 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();