2013-01-05 3 views
14

WinForm에서 WPF 컨트롤을 표시하려면 ElementHost을 사용해야하지만 WPF 컨트롤은 타사 소프트웨어이며 XML 파일과 DLL 파일 만 제공된다는 것을 알고 있습니다.이 WPF 컨트롤을 WinForm에 어떻게 추가 할 수 있습니까?

컨트롤이 AvalonEdit, 난 내 프로젝트에 모두 ICSharpCode.AvalonEdit.xmlICSharpCode.AvalonEdit.dll 파일을 추가, 나는 Project -> Add Reference에 가서 참조로 DLL을 추가했다. 이제 코드에서 ICSharpCode 네임 스페이스에 액세스 할 수 있습니다. 모든 클래스와 메서드가 노출되어 있지만이 시점부터는 실제로 WinForm에서 컨트롤을 실제로 사용하는 방법을 알 수 없습니다.

WPF 컨트롤이 솔루션 탐색기에 나타나기를 기대했지만 그렇지 않습니다. 어쨌든 ElementHost 컨트롤을 내 WinForm에 추가하려고 시도했지만 Hosted Content를 선택하려고해도 컨트롤이 나타나지 않아 WPF 컨트롤에 대해 알지 못합니다. 내 WinForm에서 AvalonEdit WPF 컨트롤을 어떻게 사용할 수 있습니까?

+3

내 질문에 대한 답변을 거부 한 사람에게 내 질문이 왜 나쁘다는 의견을 남길 수 있다면 좋을 것입니다. –

답변

16

디자인 타임에 호스팅 된 콘텐츠를 설정하려면 컨트롤이 솔루션의 일부 여야합니다. 이를 달성하는 한 가지 방법은 사용할 AvalonEdit 구성 요소가 포함 된 사용자 지정 WPF 사용자 정의 컨트롤을 만드는 것입니다.

  1. 즉는 WPF 사용자 정의 컨트롤 라이브러리 프로젝트를 만들고 AvalonEdit 구성 요소를 포함하는 사용자 컨트롤 을 만들 수 있습니다.

  2. 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를 교체하십시오.

+2

컨트롤의 이름은'AvalonEdit.TextEditor'이며, 나는 그것을 시도했다. 그것은 컨트롤에 캐스팅 될 수 없다고 말한다. 나는 이것을 시도했다 :'TextEditor editor = new TextEditor(); elementHost1.Child = editor; This.Controls.Add ((Control) editor);'왜 이것을 컨트롤에 캐스트 할 수 없습니까? –

+4

'this.Controls.Add ((Control) editor ')를'this.Controls.Add (elementHost1)'로 변경하십시오. –

+0

Ohhhh, 컨트롤 자체가 아니라 호스트를 추가 한 것을 간과했습니다. 그것은 트릭을했다!! 정말 고맙습니다! –

7
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); 
} 
관련 문제