Как найти форму владельца элемента управления WinForms, если он вложен в ElementHost?

Один из наших клиентов размещает нашу систему управления сеткой WinForms .NET iGrid.NET (http://www.10tec.com/) внутри контейнера WPF ElementHost вместе с другими элементами управления WPF. Это может показаться странным, поскольку это элемент управления WinForms внутри узла WPF внутри формы WinForms, но у них нет выбора из-за другого материала WPF, который они используют (это AvalonDock http://avalondock.codeplex.com/ стыковочный контейнер).

Проблема в том, что инфраструктура нашего элемента управления .NET datagrid требует знания родительской формы WinForms, но следующая конструкция, которую мы используем для этого, всегда возвращает null в этой ситуации:

Form myTopLevelOwnerForm = fCurrentGrid.TopLevelControl as Form;

Т.е. стандартное свойство Control.TopLevelControl, предназначенное для этой цели, возвращает null - хотя, скорее всего, так и должно быть в случае хоста WPF.

Возникает вопрос: есть ли другие способы узнать родительскую форму из текущего кода элемента управления? Скажем, с помощью дескрипторов WinAPI или лучше других нативных .NET-мемов?


person TecMan    schedule 20.12.2012    source источник
comment
Извините, на это нет ответа. Просто хотел составить вам компанию тем, что у меня похожая проблема: stackoverflow.com/questions/13825402/ - пока не повезло.   -  person doornail    schedule 16.01.2013
comment
@doornail, спасибо, что напомнили об этом! Фактически, я нашел обходной путь, который нормально работает в моем проекте. Смотрите ответ.   -  person TecMan    schedule 18.01.2013


Ответы (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;
    }
}
person TecMan    schedule 18.01.2013