当前位置:  开发笔记 > 编程语言 > 正文

启用/禁用WPF WinForms Interop问题

如何解决《启用/禁用WPFWinFormsInterop问题》经验,为你挑选了1个好方法。

我有一个WinForms用户控件,其中包含一个WPF自定义列表框.在WinForms用户控件被禁用然后重新启用后,WinForms用户控件中的WPF控件没有响应.还有其他人经历过这个吗?

每次控件被禁用/启用以修复问题时,我们必须破解灵魂去除并重新添加元素主机.

的WinForms

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

用于修复用户控件的WinForms EnabledChanged方法的Hack

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> Mark Boltuc..:

我的一位同事(感谢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);
} 

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有