Управляет выпуском краски для сплиттера в win7 x64 с помощью CAB - PullRequest
0 голосов
/ 10 января 2012

Я использую CAB и Infragistics в приложении winforms, в форме у меня есть несколько сплиттеров и пользовательских элементов управления с сетками, кнопками, метками ... внутри этих сплиттеров, когда форма открывается во время выполнения, пользовательские элементы управления не отображаются правильно, эта проблема известна для win7 x64, как описано здесь элементы управления внутри проблемы рисования Split Container в Windows 7 и здесь эта архивная ссылка из кэша веб-сайта фабрики компонентов . Обходной путь, предоставленный в вышеупомянутых темах, состоит в переопределении метода OnSizeChanged:

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

проблема с этим решением при использовании CAB, когда этот метод вызывается при инициализации компонентов формы из конструктора (InitializeComponent вызывается из конструктора), а метод OnLoad вызывается при обращении к свойству Handle, поскольку оно создается, если его значение равно нулю,

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

Здесь _presenter еще не установлен, его значение равно нулю и выбрасывается осевая точка.

Что я могу сделать для этой проблемы?

С уважением.

Ответы [ 2 ]

1 голос
/ 11 января 2012

Простым решением может быть наличие поля (_isInitilizeCompleted), чтобы указать, завершен ли метод InitilizeComponent, и изменить метод OnSizeChanged следующим образом:

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

Я не тестировал, но он должен работать, если, конечно, OnSizeChanged не нужно вызывать во время InitializeComponent.

0 голосов
/ 11 января 2012

Идея использования флага работает отлично!перед проверкой свойства Handle необходимо выполнить только проверку флага:

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