2012-05-28 64 views
0

我想將現有的Winforms項目遷移到WPF中。但是:有一些用戶控件需要在WinForm控件中離開。WPF WindowsFormsHost Winform用戶控件顯示,但不起作用

我已經將WinForms UserControl添加到WPF窗口中。它由一個RichTextBox和一些按鈕和標籤組成。這被細分成各種進一步的用戶控制。

當我將UserControl嵌入到它呈現的WPF窗口中時 - 但沒有一個按鈕顯示出任何內容。當底層進程更新例如RichTextBox不顯示內容。然而,當我在調試中檢查文本框時,我可以看到內容(儘管我必須點擊'base'才能看到此內容。)

[我發現的一個區別 - 雖然它可能不相關 - 控件位於WPF上,而非工作的Visual Studio將該對象顯示爲「密封」,但在原始Winforms項目完全運行時它不會顯示爲密封。 ]

我添加了代碼來更改標籤中的文本 - 他們也堅決拒絕更新:如果我在調試模式下檢查標籤,我又可以看到文本。

這個堆棧溢出的問題可以解決同一個問題: WindowsFormsHost Winform pdfviewer control problem

但得到的答覆並沒有做出很大的意義對我說: 它提到更換

new Window { Content = CreateContent(), Title = title }.Show(); 

但是,這不是一個一段代碼我承認:我使用的是XAML文件的代碼後面,這就是所謂的最高使用

System.Windows.Application app = new System.Windows.Application(); 
app.Run(new FormWPFApp()); 

(其中FormWPFApp是我對WPF窗口名稱)

這裏是XAML頭: -

<Window x:Class="ZedApp.FormWPFApp" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Printers="clr-namespace:ZedApp.UserControls.Printers" 
     xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 

     Title="Conversion version" Height="661" Width="1559" Loaded="Window_Loaded"> 

下面是我用兩個用戶控件的XAML(他們都來自同一個基類繼承) : -

<WindowsFormsHost Height="430" HorizontalAlignment="Left" Margin="192,32,0,0" Name="windowsFormsHostTicketPrinter" VerticalAlignment="Top" Width="324" Grid.Row="1" Grid.Column="1"> 
    <Printers:TicketPrinter x:Name="ticketPrinter"> 
    </Printers:TicketPrinter> 
</WindowsFormsHost> 
<WindowsFormsHost Height="430" HorizontalAlignment="Left" Margin="522,32,0,0" Name="windowsFormsHostJournalPrinter" VerticalAlignment="Top" Width="324" Grid.Row="1" Grid.Column="1"> 
    <Printers:JournalPrinter x:Name="journalPrinter"> 
    </Printers:JournalPrinter> 
</WindowsFormsHost> 

[我注意到另一件事是,清除富文本框的方法在Windows中的一個開始,如果在WPF WindowsFormsHost下運行蹬出以下類型的錯誤 - 「調用或BeginInvoke不能被控制直到t他已經創建了窗口句柄。「

private void ClearRichTextBox(RichTextBox rtbToClear) 
{ 
    if (rtbToClear.IsHandleCreated) 
    { 

     if (rtbToClear.InvokeRequired) 
     { 
      this.Invoke(new Action<RichTextBox>(ClearRichTextBox), new object[] {rtbToClear}); 
      return; 
     } 

     rtbToClear.Clear(); 
    } 
} 

]

什麼是此行爲可能原因和什麼,我需要做的就是在用戶控制工作中的元素?

+0

你可以發佈你的XAML嗎? – RichardOD

回答

0

與WinForms交互的正確輸入需要主機和WPF輸入系統之間的一些合作。 topic SDK中的Win32和WPF之間的消息循環解釋了這一點。在你的設置,來實現這一目標最簡單的方法就是用這樣的代碼:

Window w = new Window1(); 
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(w); 
w.Show(); 

ElementHost.EnableModelessKeyboardInterop()本質上註冊與WinForms應用程序對象的輸入鉤(其中正常運行的消息循環)和電話ComponentDispatcher.RaiseThreadMessage()。

+0

謝謝。我放棄了這一點 - 不幸的是,似乎沒有任何區別。是否還有其他消息傳遞可以/應該應用? –