WPF WinForms Взаимодействие с Enable/Disable

У меня есть пользовательский элемент управления 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, не будет закрыта.

Ответ 1

Сотруднику (спасибо 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);
} 

Ответ 2

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