如何将此 WPF 控件添加到我的 WinForm 中?
Posted
技术标签:
【中文标题】如何将此 WPF 控件添加到我的 WinForm 中?【英文标题】:How can I add this WPF control into my WinForm? 【发布时间】:2012-12-19 15:50:49 【问题描述】:我知道我必须使用ElementHost
在 WinForm 中显示 WPF 控件,但由于 WPF 控件是第三方软件,它只附带一个 XML 文件和一个 DLL 文件。
控件是AvalonEdit,我将ICSharpCode.AvalonEdit.xml
和ICSharpCode.AvalonEdit.dll
文件都添加到我的项目中,然后我转到Project -> Add Reference
并添加了DLL 作为参考。现在我可以在我的代码中访问ICSharpCode
命名空间,所有的类和方法都暴露出来了,但是从这一点上我不确定如何在我的 WinForm 中实际使用该控件。
我希望 WPF 控件出现在解决方案资源管理器中,但它没有。无论如何,我尝试将ElementHost
控件添加到我的 WinForm 中,但是当我尝试选择托管内容时,没有控件出现,因此它不知道我的 WPF 控件。如何在我的 WinForm 中使用 AvalonEdit WPF 控件?
【问题讨论】:
对于对我的问题投了反对票的人,如果您能发表评论告诉我为什么我的问题不好,那就太好了。 【参考方案1】:如果您希望能够在设计时设置托管内容,则该控件需要成为您解决方案的一部分。实现此目的的一种方法是创建一个自定义 WPF 用户控件,其中包含您要使用的 AvalonEdit 组件。即
创建 WPF 用户控件库项目并创建用户控件 包含 AvalonEdit 组件。
将用户控件项目添加到您的 Winforms 解决方案中。
现在您应该可以选择新的用户控件作为托管内容了。
或者您可以直接在代码中添加 AvalonEdit 控件,如下所示:
public Form1()
InitializeComponent();
ElementHost host= new ElementHost();
host.Size = new Size(200, 100);
host.Location = new Point(100,100);
AvalonEditControl edit = new AvalonEditControl();
host.Child = edit;
this.Controls.Add(host);
不确定该控件的名称,因此请酌情替换 AvalonEditControl。
【讨论】:
控件的名称是AvalonEdit.TextEditor
,我试过了,它说它不能转换为Control
。我试过这个:TextEditor editor = new TextEditor(); elementHost1.Child = editor; this.Controls.Add((Control)editor);
为什么不能将其转换为控件?
将this.Controls.Add((Control)editor)
更改为this.Controls.Add(elementHost1)
哦,我忽略了您添加的主机,而不是控件本身。那成功了!非常感谢!
非常抱歉,我本来打算这样做的。你的回答是救命稻草。【参考方案2】:
您还需要一个有关如何进行代码着色/语法突出显示的示例:
public Form1()
InitializeComponent();
ICSharpCode.AvalonEdit.TextEditor textEditor = new ICSharpCode.AvalonEdit.TextEditor();
textEditor.ShowLineNumbers = true;
textEditor.FontFamily = new System.Windows.Media.FontFamily("Consolas");
textEditor.FontSize = 12.75f;
string dir = @"C:\Temp\";
#if DEBUG
dir = @"C:\Dev\Sandbox\SharpDevelop-master\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Highlighting\Resources\";
#endif
if (File.Exists(dir + "CSharp-Mode.xshd"))
Stream xshd_stream = File.OpenRead(dir + "CSharp-Mode.xshd");
XmlTextReader xshd_reader = new XmlTextReader(xshd_stream);
// Apply the new syntax highlighting definition.
textEditor.SyntaxHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(xshd_reader, ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance);
xshd_reader.Close();
xshd_stream.Close();
//Host the WPF AvalonEdiot control in a Winform ElementHost control
ElementHost host = new ElementHost();
host.Dock = DockStyle.Fill;
host.Child = textEditor;
this.Controls.Add(host);
【讨论】:
【参考方案3】: ElementHost host = new ElementHost();
host.Size = new Size(200, 100);
host.Location = new Point(100, 100);
ICSharpCode.AvalonEdit.TextEditor edit = new
ICSharpCode.AvalonEdit.TextEditor();
host.Child = edit;
this.Controls.Add(host);
【讨论】:
以上是关于如何将此 WPF 控件添加到我的 WinForm 中?的主要内容,如果未能解决你的问题,请参考以下文章