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, пока форма не будет закрыта.)