2012-12-20 6 views
2

우리 고객 중 한 명은 다른 WPF 컨트롤과 함께 WPF ElementHost 컨테이너 내에 WinForms .NET 그리드 컨트롤 iGrid.NET (http://www.10tec.com/)을 호스팅합니다. WinForms 양식 내부의 WPF 호스트 내부에있는 WinForms 컨트롤처럼 이상하게 보일 수도 있지만, 다른 WPF 물건 (AvalonDock http://avalondock.codeplex.com/ 도킹 컨테이너) 때문에 선택의 여지가 없습니다.ElementHost에 중첩되어있는 경우 WinForms 컨트롤의 소유자 양식을 찾는 방법?

Form myTopLevelOwnerForm = fCurrentGrid.TopLevelControl as Form; 

즉 :

문제는 우리의 .NET의 데이터 그리드 컨트롤의 인프라가 부모 윈폼 양식을 알 필요하지만, 우리가에 사용하는 다음과 같은 구성은 항상 이런 상황에서 null을 반환한다는 것입니다 이 목적을위한 표준 Control.TopLevelControl 속성은 null을 반환합니다.하지만 WPF 호스트의 경우에는 그렇게해야합니다.

질문 : 현재 폼의 코드에서 부모 폼을 알 수있는 다른 방법이 있습니까? 말하자면, WinAPI 핸들 또는 다른 네이티브 .NET memebr을 사용하는 것입니까?

+0

죄송합니다. 그냥 내가 비슷한 문제가 회사에서 계속하고 싶었 : http://stackoverflow.com/questions/13825402/creating-a-form-from-a-winforms-control-hosted-within-wpf-owner-is- 설정되지 않음 - 지금까지 운이 없습니다. – doornail

+0

@doornail, 이것에 대해 상기시켜 주셔서 감사합니다! 사실, 나는 내 프로젝트에서 괜찮은 해결 방법을 발견했다. 답을 참조하십시오. – TecMan

답변

1

다음 코드가 작동합니다. 적어도 프로젝트에서 :

// API declaration 
[System.Runtime.InteropServices.DllImport("user32.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
public static extern IntPtr GetParent(IntPtr hWnd); 

// Main code snippet 
Control myTopLevelControl = fOwner.TopLevelControl; 

if (myTopLevelControl == null) 
{ 
    IntPtr handle = fOwner.Handle; 
    while (true) 
    { 
     IntPtr parentHandle = GetParent(handle); 
     if (parentHandle == IntPtr.Zero) 
     { 
      myTopLevelControl = Control.FromHandle(handle) as Form; 
      break; 
     } 
     handle = parentHandle; 
    } 
}