0

我在winforms应用程序中使用CAB和infragistics,在一个表单中我有一些拆分器和带有网格、按钮、标签的用户控件......在这个拆分器内,当表单在运行时打开时,用户控件没有正确绘制,这个问题以 win7 x64 为人所知,如此处所述,在 Windows 7 上的拆分容器绘制问题中进行了控制,并在此来自组件工厂网站缓存的存档链接上进行了描述。上述主题中提供的解决方法包括覆盖 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 并引发异常。

我能为这个问题做些什么?

问候。

4

2 回答 2

1

一个简单的解决方案可能是有一个字段 (_isInitilizeCompleted) 来指示 InitilizeComponent 方法是否已完成,并将 OnSizeChanged 方法修改为如下:

 protected override void OnSizeChanged(EventArgs e)
 {
     if (Handle != null && _isInitilizeCompleted)
         BeginInvoke((MethodInvoker)delegate
         { base.OnSizeChanged(e); });
 } 

我还没有测试过,但它应该可以工作,除非在 InitializeComponent 期间当然需要调用 OnSizeChanged。

于 2012-01-10T22:33:57.990 回答
0

使用标志的想法很好用!在测试 Handle 属性之前必须进行标志测试:

protected override void OnSizeChanged(EventArgs e)
    {
        if (_isInitilizeCompleted && Handle != null)
            BeginInvoke((MethodInvoker)delegate
            { base.OnSizeChanged(e); });
    }
于 2012-01-11T09:45:06.030 回答