2014-02-14 114 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应用程序。

希望这会更直接地回答问题,而不是告诉你改变一切