لا يدخل التحكم في WPF WebBrowser وضع التصميم عند تغيير خاصية المستند

StackOverflow https://stackoverflow.com/questions/1766084

سؤال

لدي مشكلة محبطة. إليك نسخة مبسطة لما أفعله:

يحتوي UserControl في C# على شريط أدوات وكائن WebBrowser مضمن. يحتوي شريط الأدوات على زر "تحرير" ، والذي عند النقر عليه يعين التحكم في 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 قابلاً للتحرير. مؤشر الماوس عندما يعرض Hoovering Over Pictures/Links مؤشرات Mouse Mouse متصفح الويب ، وليس مؤشرات التحرير. إذا قمت بالنقر فوق النص ، فلن يتم عرض الكاريت.

يكشف تصحيح الأخطاء أن خاصية DesignMode على المستند تم تعيينها فعليًا على "ON" في هذه الحالة ، لكن التحكم يتصرف كما لو تم تعيينه على "OFF".

اذا انا لا انقر في صفحة الويب قبل النقر فوق الزر "تحرير" ، كل شيء يعمل كما هو متوقع.

التفصيل:إذا قمت بالنقر فوق الزر "إلغاء" عندما يكون عنصر التحكم في وضع التصميم ، أحصل على سلوك (MIS) المقابل ، إذا تم النقر على المستند.

ما عليك سوى النقر فوق "تحرير" ، ثم "إلغاء" ، ثم "تحرير" وما إلى ذلك. دون النقر على المستند يعمل بشكل جيد (يظهر اختبار Mouseover مؤشرات الماوس المناسبة ، وأحصل انقر على رابط في المستند المعروض).

لقد جربت العديد من التقنيات للتأكد من أن تحكمًا آخر يحصل على التركيز قبل تغيير خاصية تصميم DesignMode ، لكنها لا تحدث أي فرق. لقد بحثت في MSDN ونصف الإنترنت المعروف ولم أجد أي ذكر لهذا النوع من المشكلة. يبدو أن تقليب خاصية التصميم مثل هذا أمر غير قابل للتطبيق.

واحد آخر من المعلومات: أقوم بإعداد أحداث المستندات من خلال تقديم المشورة للوثيقة مع حوض تم تنفيذه بواسطة USERCONTROL. أشك في أن هذا يجب أن يكون له أي تأثير على المشكلة ، لكنني أدرجته هنا من أجل اكتماله. تحديث: تعطيل هذا لا يغير أي شيء فيما يتعلق بالمشكلة.

هل يدرك أي شخص هذه المشكلة؟

تحديث:لقد عملت حول المشكلة من خلال إعادة إنشاء التحكم في متصفح الويب في setDesignMode (). إنه حل قبيح ، لكنه يعمل ويبدو جيدًا بالفعل. أنا مهتم جدًا بأي تعليقات على هذه المشكلة. أعتقد أنه خطأ في MSHTML.

هل كانت مفيدة؟

المحلول

لست متأكدًا تمامًا مما إذا كان لدينا نفس المشكلة تمامًا ، لكنني أفترض أن الحل يجب أن يعمل من أجلك أيضًا.

يبدو أن المشكلة الأساسية هي أن X64 يعيد تعيين سمة تصميم التصميم ، كما هو مذكور في هذه المقالة. في حالتي ، قمت بتعيينها على "ON" بعد إنشاء إنشاء WebBrowser ، ولكن في الحدث المستند ، كان "مورثًا" مرة أخرى. يعيده إلى "ON" في DocumentCompleted يجعله قابل للتحرير ، ولكنه يمسح المستند. قم بإعادة تشغيل DocumentText مرة أخرى لإعادة تشغيل حلقة Doom بأكملها.

لذلك كان أحد الحلول التي وجدتها هو الامتناع عن تعيين مستندات المستند ، بدلاً من ذلك قمت بإنشاء مستند فارغ ، ثم قمت بتعيين خاصية الجسم (التي لم تعد فارغة) خاصية 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. ومع ذلك ، هناك حل آخر عمل بالنسبة لي ، والذي يبدو أسهل وأكثر أمانًا. لقد وجدته في هذا الجواب عن طريق Laughingjohn. أعتقد أن السطر الأول يعتمد على تطبيقك ، كان لديك IHTMLDOCUMITY مباشرة في WebBrowser1.Document.

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

نصائح أخرى

يبدو لي مثل WebBrowser يحصل على التركيز عند النقر فوقه وتتمسك به بطريقة ما. جرب هذا: انقر على WebBrowser, ، ثم اضغط على مفتاح TAB على لوحة المفاتيح (التي ينبغي نقل التركيز قبالة WebBrowser) ثم معرفة ما إذا كان يمكنك النقر على الأزرار الخاصة بك.

إذا استطعت ، فحاول إرفاق معالج بـ Button.MouseEnter الحدث والمكالمة ((Button)sender).Foucs() في ذلك لتركيز الزر برمجيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top