我有用户控件覆盖WebBrowser控件。 有一种方法从其父窗体中获取BackgroundImage的一个区域,并使其成为html代码中的背景。它的工作原理如下:
我想在控件完全加载后立即触发该方法。我无法在构造函数中执行此操作,因为我需要使用的一些重要对象和父属性仍为null。 我把它放在OnVisibleChanged事件中并将bool变量设置为false,因此它只运行一次,但每次重建我的项目时它都会触发(即使没有运行 - 它创建的位图我用作html代码中的背景,但不同的目录因为我使用Directory.CurrentDirectory()方法)。尝试也用OnLoad事件触发它,但它产生与OnVisibleChanged相同的问题。 是否有比OnVisibleChanged更合适的事件?
PS。我总是想知道每个事件是否必须触发它的基类事件。有必要这样做吗?我根本没有看到任何差异,没有它一切都很好。如果最好将它留在那里,它应该在事件方法的开头还是结尾?
答案 0 :(得分:3)
没有'完全加载'的概念,创建控件是Winforms中的原子操作,并由OnHandleCreated()发出信号。你在这里寻找的是完全绘制的控件。绘画是Windows中的一项低优先级任务,仅在不需要执行任何其他操作时执行。
通过覆盖WndProc()并捕获WM_PAINT获取该通知:
bool fullyPainted = false;
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == 15 && !fullyPainted) {
fullyPainted = true;
// etc...
}
}