在可见区域重新绘制时控制时间更长

时间:2018-01-23 00:17:57

标签: c# winforms user-controls repaint

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中不再可见

第一个状态,一切都可见: All visible

然后使TableLayoutPanel行高更大(使所有子项无效): can only see one or a few less items

现在,即使所有子项再次失效,也会使行高变小并且Label不再可见: enter image description here

如果您调整应用程序的主窗体窗口大小,问题就会消失。

但是,我不想假装'用于破解解决方案的代码中的resize事件。

为什么"标签"控制重绘一旦它应该再次可见?

0 个答案:

没有答案