2015-01-13 87 views
0

我有一個遺留應用程序,它是WPF和Windows窗體的混合體。本質上,通過將ElementHost添加到Windows窗體上,將WPF應用程序加載到Windows窗體應用程序中。這個WPF應用程序然後將一個WPF用戶控件加載到它上面。嵌入在此WPF用戶控件是一個傳統的Windows控件(自定義瀏覽器控件),最終從System.Windows.Forms派生在WPF應用程序中查找嵌入式控件

有沒有辦法從代碼中動態獲取這個控件的句柄?我們不知道控件渲染時的名稱。我們所知道的是控制的基類型,正如我所提到的,它來自System.WIndows.Forms。

到目前爲止,我所見過的所有例子都討論瞭如何最終成爲DependencyObject的孩子可以被動態地發現。我還沒有遇到過一個例子,它解釋瞭如何在WPF應用程序中以編程方式發現一個老派的Windows窗體控件。

回答

0

爲了在WPF控件中託管Winforms控件,它必須使用WindowsFormsHostWindowsFormsHostDependencyObject派生

你不得不定位WPF應用程序的WindowsFormsHost元素,然後您可以訪問包含WebBrowser控制Child財產。

的僞代碼:

var controlYoureLookingFOr = GiveMeAllChildren(WPFApp) 
    .OfType<WindowsFormsHost> 
    .First(); 

var browser = (WebBrowser.Or.Something)controlYoureLookingFOr.Child; 
+0

隨着一些增加的遞歸這就像一個魅力工作!謝謝! – Nikhil

+0

@Nikhil:np。如果您將「遞歸」部分也添加爲您自己的答案或部分礦體,那將會很好。 –

0

要在這裏完成的答案是遞歸的一部分,我加入到確保整個窗口或父控件及其所有後代都走過

public static IEnumerable<T> FindAllChildrenByType<T>(this System.Windows.Forms.Control control) 
    { 
     IEnumerable<System.Windows.Forms.Control> controls = control.Controls.Cast<System.Windows.Forms.Control>(); 
     return controls 
      .OfType<T>() 
      .Concat<T>(controls.SelectMany<System.Windows.Forms.Control, T>(ctrl => FindAllChildrenByType<T>(ctrl))); 
    } 
    public static IEnumerable<T> FindVisualChildren<T>(this DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

你可以然後使用它作爲

var windowsFormHost = parentControl.FindVisualChildren<WindowsFormsHost>(); 
      foreach (var item in windowsFormHost) 
      { 
       var htmlcontrols = item.Child.FindAllChildrenByType<{sometypehere} 
       foreach (var control in htmlcontrols) 
       { 
       } 
      } 
相關問題