Winforms 使用CAB控制win7 x64上拆分器容器内部的油漆问题
我在winforms应用程序中使用CAB和infragistics,在一个表单中,我有一些拆分器和带有网格、按钮、标签的用户控件。。。在这个拆分器中,当窗体在运行时打开时,用户控件的绘制不正确,这个问题在win7 x64中是已知的,如下所述。上述主题中提供的解决方法包括重写OnSizeChanged方法:Winforms 使用CAB控制win7 x64上拆分器容器内部的油漆问题,winforms,windows-7-x64,splitter,application-blocks,Winforms,Windows 7 X64,Splitter,Application Blocks,我在winforms应用程序中使用CAB和infragistics,在一个表单中,我有一些拆分器和带有网格、按钮、标签的用户控件。。。在这个拆分器中,当窗体在运行时打开时,用户控件的绘制不正确,这个问题在win7 x64中是已知的,如下所述。上述主题中提供的解决方法包括重写OnSizeChanged方法: protected override void OnSizeChanged(EventArgs e) { if (Handle != null)
protected override void OnSizeChanged(EventArgs e)
{
if (Handle != null)
BeginInvoke((MethodInvoker)delegate
{ base.OnSizeChanged(e); });
}
使用CAB时,此解决方案的问题是,在从构造函数初始化表单组件时调用此方法(从构造函数调用InitializeComponent),在访问Handle属性时调用OnLoad方法,因为它是在其值为null时创建的
protected override void OnLoad(EventArgs e)
{
_presenter.OnViewReady();
base.OnLoad(e);
}
此处尚未设置_presenter,其值为null,并引发AxException
我能为这个问题做些什么
问候 一个简单的解决方案可能是使用一个字段(_IsInitializeCompleted)来指示InitilizeComponent方法是否已完成,并将OnSizeChanged方法修改为如下:
protected override void OnSizeChanged(EventArgs e)
{
if (Handle != null && _isInitilizeCompleted)
BeginInvoke((MethodInvoker)delegate
{ base.OnSizeChanged(e); });
}
我还没有测试,但它应该可以工作,除非在初始化Component时需要调用OnSizeChanged。使用标志的想法很好!在测试Handle属性之前,只需执行标志测试:
protected override void OnSizeChanged(EventArgs e)
{
if (_isInitilizeCompleted && Handle != null)
BeginInvoke((MethodInvoker)delegate
{ base.OnSizeChanged(e); });
}