2013-01-05 50 views
14

Tôi biết rằng tôi phải sử dụng ElementHost để hiển thị điều khiển WPF trong WinForm, nhưng khi điều khiển WPF là phần mềm của bên thứ ba và nó chỉ đi kèm với tệp XML và tệp DLL.Làm cách nào để thêm điều khiển WPF này vào WinForm của tôi?

Điều khiển là AvalonEdit, tôi đã thêm cả tệp ICSharpCode.AvalonEdit.xmlICSharpCode.AvalonEdit.dll vào dự án của mình và tôi đã truy cập Project -> Add Reference và thêm DLL làm tham chiếu. Bây giờ tôi có thể truy cập vào không gian tên ICSharpCode trong mã của tôi, tất cả các lớp và các phương thức được tiếp xúc, nhưng từ thời điểm này tôi không chắc chắn làm thế nào để thực sự sử dụng điều khiển trong WinForm của tôi.

Tôi đã mong đợi một điều khiển WPF xuất hiện trong Solution Explorer, nhưng nó không. Tôi đã thử thêm một điều khiển ElementHost để anyways WinForm của tôi, nhưng khi tôi cố gắng Chọn nội dung được lưu trữ, không có điều khiển xuất hiện, do đó, nó không biết về kiểm soát WPF của tôi. Làm thế nào tôi có thể sử dụng AvalonEdit WPF kiểm soát trong WinForm của tôi?

+3

Đối với người xuống bình chọn câu hỏi của tôi, sẽ rất tuyệt nếu bạn có thể để lại nhận xét cho tôi biết tại sao câu hỏi của tôi là xấu. –

Trả lời

16

Nếu bạn muốn có thể đặt nội dung được lưu trữ tại thời điểm thiết kế, kiểm soát cần phải là một phần của giải pháp của bạn. Một cách để đạt được điều đó là tạo một điều khiển người dùng WPF tùy chỉnh có chứa thành phần AvalonEdit mà bạn muốn sử dụng. I.e

  1. Tạo dự án thư viện điều khiển người dùng WPF và tạo điều khiển người dùng chứa thành phần AvalonEdit.

  2. Thêm dự án Kiểm soát người dùng vào giải pháp Winforms của bạn.

Bây giờ bạn sẽ có thể chọn điều khiển người dùng mới của mình làm nội dung được lưu trữ.

Hoặc bạn có thể thêm sự kiểm soát AvalonEdit trực tiếp trong mã như thế này:

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

Không chắc chắn về điều khiển được gọi là như vậy thay thế AvalonEditControl cho phù hợp.

+2

Tên của điều khiển là 'AvalonEdit.TextEditor', và tôi đã thử điều đó, nó nói rằng nó không thể được đúc thành một' Điều khiển'. Tôi đã thử điều này: 'TextEditor editor = new TextEditor(); elementHost1.Child = trình soạn thảo; this.Controls.Add ((Control) editor); 'Tại sao điều này không được gán cho một điều khiển? –

+4

Thay đổi 'this.Controls.Add ((Control) editor)' thành 'this.Controls.Add (elementHost1)' –

+0

Ohhhh, tôi bỏ qua rằng bạn đã thêm máy chủ, chứ không phải chính bản thân điều khiển. Điều đó đã làm các trick !! Cảm ơn bạn rất nhiều! –

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); 
} 
Các vấn đề liên quan