从elementhost子文本中获取文本

时间:2014-02-14 18:41:41

标签: c# wpf visual-studio-2010 wpf-controls

我不熟悉WPF或元素主机,但我想要winform应用程序的拼写检查功能。根据一些谷歌搜索,它应该像

一样简单
        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

2 个答案:

答案 0 :(得分:2)

编写应用程序时,通常最好用一种语言编写 all ,除非该语言中没有某些特定功能。如果您正在编写WinForms应用程序,因为 可用,那么使用WinForms实现拼写检查功能对我来说似乎更有意义。它肯定会更有效率。

因此,我建议您可以使用可从CopePlex网站下载的Spell Check Winforms TextBox。或者,如果已安装,则可以通过Microsoft.Office.Interop.Word.dll使用Microsoft Word中的拼写检查程序。您还可以在StackOverflow上的Spell check in winforms问题中找到一些其他有用的建议。

答案 1 :(得分:1)

这有点旧,但希望这会回答直接的问题。

可以创建自己的xaml文本框。在解决方案资源管理器中右键单击您正在处理的项目。添加新项目。查找Visual C#Items - 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访问文本。

e.g。 - label1.Text = SubjectTBox.Text;

或者,而不是通过代码手动调用SetParentText方法,如上所示。您可以将TextChanged事件设置为该方法。这可以在XamlTextBox控件的设计编辑器中完成。

实际上你可以在代码中完成所有这些,如果不是大多数的话;但这可视化更容易,您可以创建自己的XamlControl库,可以在任何WinForm应用程序中使用。

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