2013-01-05 8 views
14

Wiem, że muszę użyć ElementHost, aby wyświetlić formant WPF w WinForm, ale jako kontrola WPF jest oprogramowanie stron trzecich i to tylko pochodzi z pliku XML i pliku DLL.Jak dodać tę kontrolkę WPF do mojego WinForm?

Sterowanie jest AvalonEdit dodałem zarówno ICSharpCode.AvalonEdit.xml i ICSharpCode.AvalonEdit.dll plików do mojego projektu, i poszedłem do Project -> Add Reference i dodał DLL jako odniesienie. Teraz mogę uzyskać dostęp do przestrzeni nazw ICSharpCode w moim kodzie, wszystkie klasy i metody są ujawnione, ale od tego momentu nie jestem pewien, jak faktycznie używać formantu w moim WinForm.

Oczekiwano, że kontrolka WPF pojawi się w eksploratorze rozwiązań, ale tak się nie dzieje. Próbowałem dodać kontrolkę ElementHost do mojego WinForm tak czy inaczej, ale kiedy próbuję wybrać Hosted Content, nie pojawiają się żadne kontrole, więc nie wiem o mojej kontroli WPF. Jak mogę użyć formantu WPF AvalonEdit w moim WinForm?

+3

do osoby, która głosowała w dół na moje pytanie, byłoby miło, gdyby komentarza można zostawić mi powiedzieć dlaczego moje pytanie jest źle. –

Odpowiedz

16

Jeśli chcesz mieć możliwość ustawienia hostowanej treści w czasie projektowania, kontrola musi być częścią twojego rozwiązania. Jednym ze sposobów osiągnięcia tego jest utworzenie niestandardowego kontrolki użytkownika WPF, która zawiera komponent AvalonEdit, którego chcesz użyć. Tj

  1. Tworzenie projektu biblioteki WPF sterowania użytkownika i utworzyć formant użytkownika zawierający komponent AvalonEdit.

  2. Dodaj projekt kontroli użytkownika do rozwiązania WinForm.

Teraz powinieneś mieć możliwość wyboru nowej kontroli użytkownika jako hostowanej treści.

Albo można dodać kontrolę AvalonEdit bezpośrednio w kodzie tak:

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

Nie wiesz, co kontrola nazywa się tak wymienić AvalonEditControl jako właściwe.

+2

Nazwa kontrolki to 'AvalonEdit.TextEditor', i próbowałem tego, mówi, że nie można go przesłać do" Kontroli ". Próbowałem tego: 'edytor TextEditor = new TextEditor(); elementHost1.Child = editor; this.Controls.Add (edytor)); "Dlaczego nie można go przenieść do kontroli? –

+4

Zmień 'this.Controls.Add ((Control) editor)' na 'this.Controls.Add (elementHost1)' –

+0

Ohhhh, przeoczyłem, że dodałeś hosta, a nie samą kontrolę. To wystarczy! Dziękuję bardzo! –

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); 
} 
Powiązane problemy