2014-02-14 112 views
0

我不熟悉WPF或元素主機,但我想爲我的winform應用程序使用拼寫檢查功能。據一些谷歌搜索,它應該是這麼簡單從elementhost子文本中獲取文本

 var elementHost = this.elementHost1; 
     var wpfTextBox = (System.Windows.Controls.TextBox)elementHost.Child; 
     var text = wpfTextBox.Text; 
     MessageBox.Show(text); 

但這返回錯誤 無法投類型wpfTextBox的對象system.windows.controls.textbox。

有什麼想法?這實際上是可能的嗎?該程序是用C#System.Windows.Forms編寫的。 Visual Studio 2010

+0

什麼是'elementHost'這裏? –

+0

將調試點放在第二行,檢查elementHost.Child在巡視窗口中。 –

+0

elementHost1只是一個簡單的對象,我從工具欄拖放並放置到主持wpf。 根據檢查員,這個孩子是Heat.testWPF – Jeebwise

回答

2

在編寫應用程序時,通常最好是用一種語言編寫它全部,除非某種特定功能在該語言中不可用。如果您正在編寫WinForms應用程序,那麼使用WinForms實現拼寫檢查功能似乎更有意義,因爲它的可用。它肯定會更有效率。

因此,我建議您可以使用可從CopePlex網站下載的Spell Check Winforms TextBox。或者,如果已安裝它,則可以使用Microsoft Word中的拼寫檢查程序通過Microsoft.Office.Interop.Word.dll。您也可以在StackOverflow的Spell check in winforms問題中找到一些其他有用的建議。

+0

似乎有效。所有的googleing我做了,我無法找到Word.dll的單一參考。謝謝你指出我正確的方向。 – Jeebwise

+0

如果這個答案幫助你解決了你的問題,請按照其在本網站上的慣例[標記爲已接受](http://stackoverflow.com/help/someone-answers),以便其他用戶知道這個問題有已被回答。 – Sheridan

1

這是有點舊,但希望這將回答直接的問題。

可以創建自己的xaml文本框。在解決方案資源管理器中右鍵單擊您正在處理的項目。添加新項目。查找Visual C#項目 - WPF。然後創建一個用戶控件(WPF),它具有您想要的首選名稱(例如 - XamlTextBox.xaml)。

創建用戶控件後,請繼續並儘可能簡化設計。將大小設置爲您想要的文本框的確切大小,然後從工具箱中插入一個文本框。將文本框放在您希望看到的方式中。 (當在WinForms代碼中創建XamlTextBox時,可能會在代碼中完成調整大小和其他屬性)

轉到用戶控件的代碼。請確保您添加/更改下列代碼行:

///All of the original given references should not be removed only add to this list 
using System.Windows.Forms.Integration; //Make sure this is part of your project references 

namespace ProjectName { 
    public partial class XamlTextBox : UserControl { 
     public ElementHost Parent { 
      get { return _elementHost; } 
     } 
     private ElementHost _elementHost; 

     public XamlTextBox(ElementHost elhost) { 
      InitializeComponenet(); 
      _elementHost = elhost; 
     } 

     public void SetParentText() { 
      Parent.Text = this.textBox1.Text; 
     } 
    } 
} 

此XamlTextBox現在可以根據需要在您的窗體中實現。

public partial class MainForm: Form { 
    ElementHost SubjectTBox = new ElementHost(); 

    public MainForm() { 
     InitializeComponent(); 
     SubjectTBox.Size = new Size(545, 20); 
     SubjectTBox.Location = new Point(77, 12); 
     XamlTextBox subject = new XamlTextBox(SubjectTBox); 
     subject.SubjectTBox.SpellCheck.IsEnabled = true; 
     SubjectTBox.Child = subject; 
     this.Controls.Add(SubjectTBox); 
    } 
} 

這將允許您現在在窗體上看到XamlTextBox。

如果你現在想要訪問文本,你可以使用此行代碼到XamlTextBox文本傳遞迴父ElementHost的:

((XamlTextBox)SubjectTBox.Child).SetParentText(); 

現在,您可以訪問使用SubjectTBox.Text文本。

例如 - label1.Text = SubjectTBox.Text;

或者,而不是通過代碼手動調用SetParentText方法,如上所示。您可以將TextChanged事件設置爲該方法。這可以在XamlTextBox控件的設計編輯器中完成。

實際上,你可能會做所有,如果不是大多數,在代碼中;但是這樣可以更容易地形象化,並且您可以創建自己的XamlControl庫,該庫可用於任何WinForm應用程序。

希望這會更直接地回答問題,而不是告訴你改變一切