gpt4 book ai didi

c# - Control.Invalidate 不会触发隐藏或不可见控件的绘制事件

转载 作者:行者123 更新时间:2023-11-30 20:35:21 28 4
gpt4 key购买 nike

当我在隐藏或不可见控件上调用 Invalidate 方法时,不会触发绘制事件。

这是 Windows 窗体控件的行为吗?有没有可用的文档?

我检查了Control.Invalidate 方法的文档,但它没有提到不可见控件 https://msdn.microsoft.com/en-in/library/system.windows.forms.control.invalidated(v=vs.110).aspx

我检查了以下 SO 问题 How are the painting of invisible controls handled in WinForms?但它被问到紧凑框架中的闪烁问题,与我的问题无关

最佳答案

嗯,我认为调查此问题的最佳方法是检查 Microsoft 的源代码。这是怎么回事:

Control 设置为 Visible false 时,Control 的 handle created 标志也设置为 false

Invalidate() 方法(下面的源代码)在 IsHandleCreated 为 false 时不起作用;这就是整个故事。

/// <include file='doc\Control.uex' path='docs/doc[@for="Control.Invalidate3"]/*' />
/// <devdoc>
/// Invalidates the control and causes a paint message to be sent to the control.
/// This will not force a synchronous paint to occur, calling update after
/// invalidate will force a synchronous paint.
/// </devdoc>
public void Invalidate(bool invalidateChildren)
{
if (IsHandleCreated)
{
if (invalidateChildren)
{
SafeNativeMethods.RedrawWindow(new HandleRef(window, Handle),
null, NativeMethods.NullHandleRef,
NativeMethods.RDW_INVALIDATE |
NativeMethods.RDW_ERASE |
NativeMethods.RDW_ALLCHILDREN);
}
else
{
// It's safe to invoke InvalidateRect from a separate thread.
using (new MultithreadSafeCallScope())
{
SafeNativeMethods.InvalidateRect(new HandleRef(window, Handle),
null,
(controlStyle & ControlStyles.Opaque) != ControlStyles.Opaque);
}
}

NotifyInvalidate(this.ClientRectangle);
}
}

关于c# - Control.Invalidate 不会触发隐藏或不可见控件的绘制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38137654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com