如何将此WPF控件添加到我的WinForm中?

时间:2013-01-05 08:46:50

标签: c# wpf winforms avalonedit

我知道我必须使用ElementHost在WinForm中显示WPF控件,但由于WPF控件是第三方软件,它只附带一个XML文件和一个DLL文件。

控件是AvalonEdit,我将ICSharpCode.AvalonEdit.xmlICSharpCode.AvalonEdit.dll文件添加到我的项目中,然后我转到Project -> Add Reference并添加了DLL作为参考。现在我可以在我的代码中访问ICSharpCode命名空间,所有的类和方法都暴露出来,但从这一点来说,我不确定如何在我的WinForm中实际使用该控件。

我期待WPF控件出现在解决方案资源管理器中,但事实并非如此。我尝试将ElementHost控件添加到我的WinForm中,但是当我尝试选择托管内容时,没有出现任何控件,因此它不知道我的WPF控件。如何在WinForm中使用AvalonEdit WPF控件?

3 个答案:

答案 0 :(得分:17)

如果您希望能够在设计时设置托管内容,则控件需要成为解决方案的一部分。实现此目的的一种方法是创建一个自定义WPF用户控件,其中包含您要使用的AvalonEdit组件。我是

  1. 创建WPF用户控件库项目并创建用户控件 包含AvalonEdit组件。

  2. 将用户控件项目添加到Winforms解决方案。

  3. 现在,您应该可以选择新的用户控件作为托管内容。

    或者你可以直接在这样的代码中添加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。

答案 1 :(得分:8)

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);
}

答案 2 :(得分:0)

this is result

        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);