【问题标题】:Getting the text from a elementhost child text从元素宿主子文本中获取文本
【发布时间】:2015-07-10 00:41:37
【问题描述】:

我不熟悉 WPF 或元素宿主,但我想要我的 winform 应用程序的拼写检查功能。根据几个google搜索,应该很简单

        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 编写的。视觉工作室 2010

【问题讨论】:

  • 这里的elementHost 是什么?
  • 将调试点放在第二行,检查 elementHost.Child 在检查器窗口中是什么。
  • elementHost1 只是我从工具栏中拖放来托管 wpf 的一个对象。根据检查员,孩子是 Heat.testWPF
  • 您是否想将 winforms 的内容与 wpf 混合使用?
  • 我是。我在 winforms 中编写了整个程序,在完成之前从未考虑过拼写检查。没有它我也可以生活,但如果可以做到,我真的很想拥有它。

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


【解决方案1】:

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

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

【讨论】:

  • 这似乎奏效了。我做的所有谷歌搜索都找不到对 Word.dll 的单一引用。感谢您为我指明正确的方向。
【解决方案2】:

这有点老了,但希望这能回答直接的问题。

可以创建自己的 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 应用程序中使用。

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

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2021-03-25
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多