2013-12-20 59 views
8

我已經使用了this blog中的代碼,如下所示,但刪節了,我在主窗口中看到了WinForm,但我在其中放置的示例文本不可見。爲什麼我的WPF託管WinForm爲空?

[System.Windows.Markup.ContentProperty("Child")] 
public class WinFormsHost : HwndHost 
{ 
    public WinFormsHost() 
    { 
    var form = new ChildForm(); 
    Child = form; 
    } 
    private System.Windows.Forms.Form child; 
    public event EventHandler<ChildChangedEventArgs> ChildChanged; 
    public System.Windows.Forms.Form Child 
    { 
    get { return child; } 
    set 
    { 
     HwndSource ps = PresentationSource.FromVisual(this) as HwndSource; 
     if (ps != null && ps.Handle != IntPtr.Zero) 
     { 
     throw new InvalidOperationException("Cannot set the Child property after the layout is done."); 
     } 
     Form oldChild = child; 
     child = value; 
     OnChildChanged(oldChild); 
    } 
    } 

    private void CheckChildValidity() 
    { 
    if (child == null || child.Handle == IntPtr.Zero) 
    { 
     throw new ArgumentNullException("child form cannot be null"); 
    } 
    } 

    public Boolean ShowCaption 
    { 
    get 
    { 
     CheckChildValidity(); 
     return (GetWindowStyle(Child.Handle) & WindowStyles.WS_BORDER) == WindowStyles.WS_CAPTION; 
    } 
    set 
    { 
     if (child == null) 
     { 
     this.ChildChanged += delegate 
     { 
      if (value) 
      { 
      SetWindowStyle(Child.Handle, GetWindowStyle(Child.Handle) | WindowStyles.WS_CAPTION); 
      } 
      else 
      { 
      SetWindowStyle(Child.Handle, GetWindowStyle(Child.Handle) & ~WindowStyles.WS_CAPTION); 
      } 
     }; 
     } 
     else 
     { 
     if (value) 
     { 
      SetWindowStyle(Child.Handle, GetWindowStyle(Child.Handle) | WindowStyles.WS_CAPTION); 
     } 
     else 
     { 
      SetWindowStyle(Child.Handle, GetWindowStyle(Child.Handle) & ~WindowStyles.WS_CAPTION); 
     } 
     } 
    } 
    } 

    protected override HandleRef BuildWindowCore(HandleRef hwndParent) 
    { 
    CheckChildValidity(); 
    HandleRef childHwnd = new HandleRef(Child, child.Handle); 
    SetWindowStyle(childHwnd.Handle, WindowStyles.WS_CHILD | GetWindowStyle(childHwnd.Handle)); 
    WindowsFormsHost.EnableWindowsFormsInterop(); 
    System.Windows.Forms.Application.EnableVisualStyles(); 
    SetParent(childHwnd.Handle, hwndParent.Handle); 
    return childHwnd; 
    } 
} 

和:

<Window x:Class="WinFormsHost" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
    xmlns:cc="clr-namespace:XTime.Shell.WinformsHost" 
    Title="Hosting Form In WPF"> 
    <cc:WinFormsHost ShowCaption="False"> 
    <wf:Form/> 
    </cc:WinFormsHost> 
</Window> 
+1

你是否需要託管一個表單,或者你可以託管一個UserControl並使用內建的'WindowsFormHost'? – Iain

+0

它必須是一種形式。我用C#重寫了一個Delphi應用程序,並告訴我是否可以託管一個Windows窗體,這是一個Win32窗口,我也可以託管一個Delphi窗體,也是一個Win32窗口。 – ProfK

+0

您無法託管窗體(如果它具有窗口鑲邊),則只能使用UserControl並使用一些適合UserControl的其他控件。 –

回答

9
<cc:WinFormsHost ShowCaption="False"> 
    <wf:Form/> 
    </cc:WinFormsHost> 

XAML中嵌入WinFormsHost內System.Windows.Forms.Form中的對象。這就是你所得到的,只是一個沒有嵌入子控件的空白表單。它看起來像你試圖在WinFormsHost構造函數中創建你自己的,分配Child屬性,但是你的XAML重寫它,所以你只是留下一個空白表單。

我把ChildForm類相同的命名空間內:

using System.Windows.Forms; 
using System.Drawing; 
... 

public class ChildForm : System.Windows.Forms.Form { 
    public ChildForm() { 
     this.BackColor = Color.FromKnownColor(KnownColor.Window); 
     var lbl = new Label { Text = "Hello world" }; 
     this.Controls.Add(lbl); 
    } 
} 

,並更新了XAML到:

<cc:WinFormsHost ShowCaption="False"> 
    <cc:ChildForm/> 
</cc:WinFormsHost> 

要獲取:

enter image description here

設置FormBorderStyle到沒有擺脫邊界。等等。

將窗體的TopLevel屬性設置爲false,將Visible屬性設置爲true是將窗體轉換爲子控件btw的簡單方法。我以這種方式離開了它,因爲你暗示你可能想給Delphi窗口提供相同的處理。在這種情況下,您可能需要再次回到原始方法,在窗體類構造函數中創建子項,並只是省略XAML中的內容分配。

相關問題