2009-11-19 13 views
5

बदल गया है डिज़ाइन मोड में प्रवेश नहीं करता मैं एक निराशा होती समस्या है। यहाँ मैं क्या कर रहा का एक सरलीकृत संस्करण है:WPF WebBrowser नियंत्रण जब दस्तावेज़ संपत्ति

ग में एक UserControl # एक उपकरण पट्टी और एक एम्बेडेड WebBrowser वस्तु में शामिल है। टूलबार में "एडिट" बटन होता है, जिसे क्लिक करने पर डिज़ाइन मोड में वेबब्रोसर नियंत्रण सेट होता है। एक और बटन, "रद्द करें", डिज़ाइन मोड बंद कर देता है।

स्यूडोकोड (बहुत सरल):

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 
} 

समस्या: अगर मैं "संपादन" बटन पर प्रदर्शित वेब पृष्ठ पर क्लिक करें और फिर, WebBrowser नियंत्रण नहीं संपादन योग्य बन जाएगा । माउस पॉइंटर जब चित्र/लिंक पर होवर करते हैं तो वेब ब्राउज़र नेविगेशन माउस पॉइंटर्स दिखाते हैं, संपादन वाले नहीं। अगर मैं पाठ में क्लिक करता हूं, तो कैरेट प्रदर्शित नहीं होगा।

डिबगिंग से पता चलता है कि दस्तावेज़ पर डिज़ाइनमोड संपत्ति वास्तव में इस स्थिति में "चालू" पर सेट है, लेकिन नियंत्रण इस तरह व्यवहार कर रहा है जैसे कि यह "ऑफ" पर सेट हो।

अगर मैं "संपादन" बटन क्लिक करने से पहले वेब पेज में क्लिक नहीं कर , सब कुछ उम्मीद के रूप में काम करता है।

विस्तार: अगर मैं "रद्द करें" बटन पर क्लिक करें नियंत्रण डिजाइन मोड में है, मैं, इसी (गलत) व्यवहार मिलता है दस्तावेज़ में क्लिक किया गया है

, बस पर क्लिक "। संपादित करें ", तो" रद्द करें ", तो" संपादित करें "आदि कभी क्लिक करने में दस्तावेज़ ठीक काम करता है बिना (माउसओवर परीक्षण उचित माउस पॉइंटर को पता चलता है, और मैं डिज़ाइन मोड पर निर्भर करता है अगर मैं में एक लिंक पर क्लिक करें लिंक नेविगेशन या संपादन मिल प्रदर्शित दस्तावेज़)।

मुझे यकीन है कि एक और नियंत्रण ध्यान केंद्रित करने से पहले मैं designMode संपत्ति बदल जाता है बनाने के लिए विभिन्न तकनीकों की कोशिश की है, लेकिन यह कोई फर्क नहीं पड़ता। मैंने एमएसडीएन और ज्ञात इंटरनेट के आधे की खोज की है और इस तरह की समस्या का कोई उल्लेख नहीं मिला है। डिजाइन को फ़्लिप करना इस तरह की संपत्ति संपत्ति काफी अनौपचारिक प्रतीत होती है। जानकारी के

एक और tidbit: मैं एक सिंक usercontrol द्वारा कार्यान्वित के साथ दस्तावेज़ सलाह देने दस्तावेज़ घटनाओं सेट कर रहा हूं। मुझे संदेह है कि इस समस्या पर कोई असर होना चाहिए, लेकिन मैंने इसे पूरा होने के लिए यहां शामिल किया है। अद्यतन: इसे अक्षम करने से समस्या के बारे में कुछ भी नहीं बदला जाता है।

किसी को भी इस समस्या को पहचान करता है?

अद्यतन: मैं SetDesignMode में वेब ब्राउज़र नियंत्रण फिर से बनाने के द्वारा समस्या को हल काम किया है()। यह एक बदसूरत समाधान है, लेकिन यह काम करता है और वास्तव में ठीक दिखता है। हालांकि, मुझे इस समस्या पर किसी भी प्रतिक्रिया में बहुत दिलचस्पी है। मेरा मानना ​​है कि यह एमएसएचटीएमएल में एक बग है।

उत्तर

8

मुझे बिल्कुल यकीन नहीं है कि अगर हमें बिल्कुल वही समस्या है, लेकिन मुझे लगता है कि मेरा समाधान आपके लिए भी काम करना चाहिए।

मूल समस्या यह प्रतीत होती है कि x64 डिज़ाइनमोड विशेषता को रीसेट करता है, जैसा कि this article में उल्लेख किया गया है। मेरे मामले में, मैंने वेबब्रोसर को तुरंत चालू करने के बाद इसे "चालू" पर सेट किया, लेकिन दस्तावेज़ पूर्ण घटना में, यह फिर से "इनहेरिट" था। इसे वापस दस्तावेज़ में "चालू" पर सेट करने से इसे संपादन योग्य बनाता है, लेकिन दस्तावेज़ को साफ़ करता है। DocumentText को सेट करना फिर से पूरे डूम लूप को पुनरारंभ करता है।

तो एक समाधान मैंने पाया DocumentText स्थापित करने से बचना था, बजाय मेरे द्वारा बनाए गए एक खाली दस्तावेज़ है, तो सेट शरीर की 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" 

, यह केवल तभी काम करता है जब आपके पास पाठ तैयार हो, और यदि आप किसी URL पर नेविगेट नहीं कर रहे हैं। हालांकि, एक और समाधान है जो मेरे लिए काम करता है, जो आसान और सुरक्षित लगता है। मैंने इसे this answer में हंसते हुए जॉन द्वारा पाया। मुझे लगता है कि पहली पंक्ति आपके आवेदन पर निर्भर करती है, आपके पास WebBrowser1.Document में IHTMLDocument था।

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

दोनों विधियां काम करती हैं, धन्यवाद। तथापि; पहली विधि किसी भी तरह से मेरी "पूर्ववत करें" (Ctrl-Z/ExecCommand ("Undo" ...)) को क्रिया से बाहर रखती है। दूसरी विधि पर, परिवर्तन किसी कारण से WebBrowser.DocumentText पर प्रतिबिंबित नहीं होते हैं। मैं webBrowser.Dcoument.Body.InnerHtml के माध्यम से इसे निकालने में सक्षम था हालांकि समस्या को हल किया। – Natan

0

मुझे लगता है कि WebBrowser पर ध्यान केंद्रित किया जाता है जब आप उस पर क्लिक करते हैं और किसी भी तरह से इसे पकड़ते हैं। इसे आज़माएं: WebBrowser पर क्लिक करें, फिर कीबोर्ड पर टैब कुंजी दबाएं (WebBrowser पर फ़ोकस को स्थानांतरित करें) और फिर देखें कि आप अपने बटन पर क्लिक कर सकते हैं या नहीं।

यदि आप कर सकते हैं, तो Button.MouseEnter ईवेंट में हैंडलर को अटैच करने का प्रयास करें और प्रोग्राम को प्रोग्राम पर ध्यान केंद्रित करने के लिए ((Button)sender).Foucs() पर कॉल करें।

संबंधित मुद्दे