Winforms 使用CAB控制win7 x64上拆分器容器内部的油漆问题

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)

我在winforms应用程序中使用CAB和infragistics,在一个表单中,我有一些拆分器和带有网格、按钮、标签的用户控件。。。在这个拆分器中,当窗体在运行时打开时,用户控件的绘制不正确,这个问题在win7 x64中是已知的,如下所述。上述主题中提供的解决方法包括重写OnSizeChanged方法:

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); });
    }