WPF WinForms Interop проблема с включением / отключением - PullRequest
10 голосов
/ 17 марта 2009

У меня есть пользовательский контроль WinForms, на котором размещен собственный список WPF. После того, как пользовательский элемент управления WinForms отключается, а затем снова включается, элемент управления WPF в пользовательском элементе управления WinForms не отвечает. Кто-нибудь еще испытывал это?

Мы должны были взломать элемент «удалить» и заново добавлять хост элемента каждый раз, когда элемент управления отключается / включается, чтобы исправить проблему.

WinForms

wpfControl.Enabled = false;
...
wpfControl.Enabled = true;

Взлом для исправления в методе WinForms EnabledChanged для usercontrol

if ( Enabled ) 
{
  ElementHost oldEh = ctlElementHost;
  ElementHost eh = new ElementHost();
  eh.Name = oldEh.Name;
  oldEh.Child = null;
  eh.Child = wpfControl;
  this.Controls.Remove( ctlElementHost );
  this.Controls.Add( eh );
  eh.Dock = DockStyle.Fill;

  oldEh.Dispose();
  ctlElementHost = eh;
}

Похоже, что произошла утечка памяти, когда размещенные хосты элементов все еще остаются, пока родительская форма, на которой размещался пользовательский контроль WinForms, не будет закрыта.

Ответы [ 2 ]

7 голосов
/ 12 июня 2009

Сотруднику (спасибо KwB) удалось найти исправление для этой проблемы: http://support.microsoft.com/kb/955753

Включает наследование от ElementHost и ручное указание области окна для включения:

public class MyElementHost : ElementHost
{
    protected override void OnEnabledChanged(EventArgs e)
    {
        SynchChildEnableState(); 

        base.OnEnabledChanged(e);
    } 

    private void SynchChildEnableState()
    {
        IntPtr childHandle = GetWindow(Handle, GW_CHILD);
        if (childHandle != IntPtr.Zero)
        {
            EnableWindow(childHandle, Enabled);
        }
    } 

    private const uint GW_CHILD = 5; 

    [DllImport("user32.dll")]
    private extern static IntPtr GetWindow(IntPtr hWnd, uint uCmd); 

    [DllImport("user32.dll")]
    private extern static bool EnableWindow(IntPtr hWnd, bool bEnable);
} 
1 голос
/ 02 апреля 2009

Хост элемента подписывается на события из пользовательского элемента управления WPF? Если это так, и события не разрываются перед попыткой избавиться от хоста элемента, он будет зависать в памяти до тех пор, пока не будет удален элемент управления WPF (и, похоже, вы используете один и тот же экземпляр элемента управления во всех до тех пор, пока форма не будет закрыта.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...