0

Winforms アプリケーションで CAB とインフラジスティックスを使用しています。このスプリッター内にグリッド、ボタン、ラベルを備えたスプリッターとユーザー コントロールがいくつかあるフォームで、実行時にフォームを開くと、ユーザー コントロールが正しく描画されません。この問題は win7 x64 で既知であり、ここで説明されているように、Windows 7 の Split Container ペイントの問題内のコントロール、Component Factory の Web サイト キャッシュからのこのアーカイブ リンクで説明されています。上記のトピックで提供されている回避策は、OnSizeChanged メソッドをオーバーライドすることで構成されています。

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

コンストラクターからフォーム コンポーネントを初期化するときにこのメソッドが呼び出され (コンストラクターから呼び出される InitializeComponent )、値が null の場合に作成されるため、Handle プロパティにアクセスするときに OnLoad メソッドが呼び出される CAB を使用する場合のこのソリューションの問題点、

protected override void OnLoad(EventArgs e)
    {            
        _presenter.OnViewReady();
        base.OnLoad(e);            
    }

ここで _presenter はまだ設定されておらず、その値は null であり、例外がスローされます。

この問題について何ができますか?

よろしく。

4

2 に答える 2

1

簡単な解決策は、InitilizeComponent メソッドが完了したかどうかを示すフィールド (_isInitilizeCompleted) を用意し、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 に答える