2009-11-19 29 views
5

Tôi gặp sự cố bực bội. Đây là một phiên bản đơn giản của những gì tôi đang làm:Điều khiển trình duyệt Web WPF không nhập chế độ thiết kế khi thuộc tính tài liệu bị thay đổi

Một UserControl trong C# chứa một thanh công cụ và một đối tượng WebBrowser được nhúng. Thanh công cụ có chứa nút "Chỉnh sửa", khi được nhấp đặt bộ điều khiển trình duyệt web trong chế độ thiết kế. Nút khác, "Hủy", tắt chế độ thiết kế.

Mã giả (rất đơn giản):

public void SetDesignMode(bool dm) { 
    IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2; 
    if (dm) doc.designMode = "On"; 
    else doc.designMode = "Off"; 
    _designMode = dm; 
    ReloadDocument(); // setting designmode clears the document element, so it must be reloaded 
} 

public void OnLoadCompleted() { 
    IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2; 
    if (!_documentLoaded) { 
    if (_designMode) doc.designMode = "On"; 
    else doc.designMode = "Off"; 
    ReloadDocument(); 
    _documentLoaded = true; 
    } 
} 

public void ReloadDocument() { 
    _documentLoaded = false; 
    // code that navigates to the document 
} 

Vấn đề: Nếu tôi bấm vào trang web hiển thị, và sau đó vào nút "Edit", sự kiểm soát WebBrowser sẽ không trở thành có thể chỉnh sửa . Con trỏ chuột khi hoovering trên hình ảnh/liên kết hiển thị các con trỏ chuột điều hướng trình duyệt web, không phải là những người chỉnh sửa. Nếu tôi nhấp vào văn bản, dấu mũ sẽ không hiển thị.

Gỡ lỗi cho thấy thuộc tính designMode trên tài liệu thực sự được đặt thành "Bật" trong trường hợp này, nhưng điều khiển hoạt động như thể được đặt thành "Tắt".

Nếu tôi không nhấp chuột trong trang web trước khi nhấp vào nút "Edit", mọi thứ hoạt động như mong đợi.

Lập: Nếu tôi nhấp vào nút "Hủy bỏ" khi điều khiển đang ở chế độ thiết kế, tôi nhận được (mis) hành vi tương ứng, nếu tài liệu đã được nhấp trong

Đơn giản chỉ cần nhấp vào ". Chỉnh sửa ", sau đó" Hủy ", sau đó" Chỉnh sửa "vv mà không bao giờ nhấp vào tài liệu hoạt động tốt (kiểm tra di chuột hiển thị con trỏ chuột thích hợp và tôi nhận được điều hướng liên kết hoặc chỉnh sửa tùy thuộc vào chế độ thiết kế nếu tôi nhấp vào liên kết trong tài liệu được hiển thị).

Tôi đã thử các kỹ thuật khác nhau để đảm bảo rằng một điều khiển khác sẽ tập trung trước khi tôi thay đổi thuộc tính designMode, nhưng nó không tạo ra bất kỳ sự khác biệt nào. Tôi đã tìm kiếm MSDN và một nửa của internet được biết đến và đã không tìm thấy bất kỳ đề cập đến loại vấn đề. Việc lật thuộc tính designMode như thế này có vẻ hơi bất thường.

Một chút thông tin khác: Tôi đang thiết lập các sự kiện tài liệu bằng cách thông báo tài liệu với bồn rửa do người dùng điều khiển thực hiện. Tôi nghi ngờ rằng điều này cần phải có bất kỳ mang về vấn đề này, nhưng tôi đã bao gồm nó ở đây vì lợi ích của việc hoàn thành. Cập nhật: Tắt tính năng này không làm thay đổi bất kỳ điều gì liên quan đến sự cố.

Có ai nhận ra vấn đề này không?

Cập nhật: Tôi đã giải quyết vấn đề bằng cách tạo lại điều khiển trình duyệt web trong SetDesignMode(). Đó là một giải pháp xấu xí, nhưng nó hoạt động và thực sự trông ổn. Mặc dù vậy, tôi rất quan tâm đến bất kỳ phản hồi nào về vấn đề này. Tôi tin rằng đó là một lỗi trong MSHTML.

Trả lời

8

Tôi không hoàn toàn chắc chắn nếu chúng tôi đã có chính xác cùng một vấn đề, nhưng tôi cho rằng giải pháp của tôi sẽ làm việc cho bạn là tốt.

Vấn đề cơ bản dường như là x64 đặt lại thuộc tính designMode, như được ghi chú trong this article. Trong trường hợp của tôi, tôi đặt nó thành "Bật" sau khi khởi tạo trình duyệt web, nhưng trong sự kiện DocumentCompleted, nó lại được "Kế thừa". Đặt nó trở về "Bật" trong DocumentCompleted làm cho nó có thể chỉnh sửa, nhưng xóa tài liệu. Việc đặt lại DocumentText sẽ khởi động lại toàn bộ vòng lặp doom.

Vì vậy, một giải pháp tôi thấy được để tránh thiết lập DocumentText, thay vào đó tôi tạo ra một tài liệu trống rỗng, sau đó thiết lập của cơ thể (mà vào thời điểm này không còn null) thuộc tính innerHTML:

doc.designMode = "On"; // enable editing 

// designMode change resets the document, create it anew 
webBrowser1.Document.Write("<html><body></body></html>") 
webBrowser1.Document.Body.InnerHtml = "myDocumentText" 

Rõ ràng, điều này chỉ hoạt động nếu bạn có văn bản sẵn sàng và không phải nếu bạn đang điều hướng đến một URL. Tuy nhiên, có một giải pháp khác làm việc cho tôi, điều này có vẻ dễ dàng hơn và an toàn hơn. Tôi tìm thấy nó trong this answer bởi LaughingJohn. Tôi đoán dòng đầu tiên phụ thuộc vào ứng dụng của bạn, bạn đã có IHTMLDocument trực tiếp trong webBrowser1.Document.

doc = webBrowser1.Document.DomDocument as IHTMLDocument2; 
if (doc != null && doc.body != null) 
    ((HtmlBody)doc.body).contentEditable = "true"; 
+0

Cả hai phương pháp đều hoạt động, cảm ơn. Tuy nhiên; Phương pháp đầu tiên bằng cách nào đó đặt "Hoàn tác" của tôi (Ctrl-Z/ExecCommand ("Hoàn tác" ...)) không hoạt động. Trên phương pháp thứ hai, các thay đổi không được phản ánh cho webBrowser.DocumentText vì một số lý do. Tôi đã có thể giải nén nó thông qua webBrowser.Dcoument.Body.InnerHtml và khắc phục sự cố. – Natan

0

Nghe có vẻ như tôi là WebBrowser sẽ tập trung khi bạn nhấp vào nó và bằng cách nào đó giữ nó. Hãy thử điều này: bấm vào các WebBrowser, sau đó nhấn phím Tab trên bàn phím (mà nên di chuyển tiêu điểm ra khỏi WebBrowser) và sau đó xem nếu bạn có thể bấm vào nút của bạn.

Nếu có thể, hãy thử gắn một trình xử lý vào sự kiện Button.MouseEnter và gọi ((Button)sender).Foucs() trong đó để tập trung nút theo chương trình.

Các vấn đề liên quan