C#.Net 4.5使用SplitterControl(Dock.Fill)Winform UserControl,Panel(Panel_L)左边的Dock.Fill和分割器控件右边的TableLayoutPanel,锚定左,上,右,下。没有水平滚动条,唯一的垂直滚动条位于TableLayoutPanel上。
Panel_L包含UserControls作为标签。当无效并强制重绘时,更新这些标签以将其自身重新定位到右侧TableLayoutPanel中匹配的已分配项目。如果TableLayoutPanel行高度更改,Panel_L中的匹配标签将重新自行重新排列。随着行高度的增加,可见的项目更少。当您减小行高时,TableLayoutPanel中的更多项目将再次可见,但左侧的匹配标签不会。如果您调整分割器宽度,则会出现同样的问题。
标签颜料代码非常标准:
var charSizeF = e.Graphics.MeasureString(Text.Substring(0,1), Font);
var textSizeF = e.Graphics.MeasureString(Text, Font);
Size = new Size((int)(textSizeF.Width + _textPaddingMultiplierWidth * charSizeF.Width), (int)(charSizeF.Height * _textPaddingMultiplierHeight));
var screenLocParent = Parent.PointToScreen(Parent.Location);
var screenLocThis = new Point(screenLocParent.X + Parent.ClientRectangle.Width - Size.Width, screenLocParent.Y + _matchingItemOnRight.Location.Y - (Size.Height / 2));
Location = Parent.PointToClient(screenLocThis);
var crX = ClientRectangle.X;
var crY = ClientRectangle.Y;
var crWidth = ClientRectangle.Width;
var crHeight = ClientRectangle.Height;
if (Padding != Padding.Empty)
{
crX += Padding.Left;
crY += Padding.Top;
crWidth -= (Padding.Left + Padding.Right);
crHeight -= (Padding.Top + Padding.Bottom);
}
var paintRect = new Rectangle(crX, crY, crWidth, crHeight);
e.Graphics.DrawString(
Text,
Font,
new SolidBrush(ForeColor),
paintRect, style);
问题在于"标签"当TableLayoutPanel的行高再次减少以显示TableLayoutPanel中项目的匹配标签时,Panel_L中不再可见
然后使TableLayoutPanel行高更大(使所有子项无效):
现在,即使所有子项再次失效,也会使行高变小并且Label不再可见:
如果您调整应用程序的主窗体窗口大小,问题就会消失。
但是,我不想假装'用于破解解决方案的代码中的resize事件。
为什么"标签"控制重绘一旦它应该再次可见?