2

お客様の1人が、WinForms .NETグリッドコントロールiGrid.NET(http://www.10tec.com/)を他のWPFコントロールと一緒にWPFElementHostコンテナー内でホストしています。WinFormsフォーム内のWPFホスト内のWinFormsコントロールであるため、奇妙に見えるかもしれませんが、使用する他のWPFのもの(AvalonDock http://avalondock.codeplex.com/ドッキングコンテナー)のため、選択の余地はありません。

問題は、.NETデータグリッドコントロールのインフラストラクチャが親のWinFormsフォームを認識している必要があることですが、この状況で使用する次の構造は常にnullを返します。

Form myTopLevelOwnerForm = fCurrentGrid.TopLevelControl as Form;

つまり、この目的を目的とした標準のControl.TopLevelControlプロパティはnullを返しますが、WPFホストの場合はnullを返す可能性があります。

問題は、現在のコントロールのコードから親フォームを知る他の方法はありますか?たとえば、WinAPIハンドルまたはより優れた他のネイティブ.NETメンバーを使用していますか?

4

1 に答える 1

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;
    }
}
于 2013-01-18T07:43:37.310 に答える