سؤال

أنا أستخدم أ WebBrowser مكون في WPF لاستضافة بعض JavaScript + HTML وأريد أن أكون قادرًا على تمرير كائن قابل للتخصيص باعتباره ObjectForScripting ملكية.هدفي النهائي هو تشغيل جافا سكريبت في ملف WebBrowser يمكن استدعاء شيء مثل:

window.external['lookup'].getValue(someId);

يمكنني تحقيق شيء قريب من هذا من خلال تنفيذ فصل دراسي باستخدام ComVisible ضبط ل true التي لديها lookup الملكية عليه:

[ComVisible(true)]
public class ScriptingContext
{
    public LookupService lookup { get; set; } //where LookupService is also ComVisible
}

ومع ذلك، أريد أن أكون مرنًا بشأن الأعضاء في ObjectForScripting التي أقوم بتمريرها لذا لا يمكنني تحديد ما ستكون عليه كل خاصية مسبقًا.

من الناحية المثالية، أود فقط تحديد زوج من كائنات الاسم لتمريره، ولكن هذا لا يعمل.

ما حاولت (وفشلت فيه) حتى الآن:

  • باستخدام أ Dictionary<string,object> كما السياق الخاص بي
  • باستخدام امتداد Dictionary<string,object> التي تم وضع علامة عليها ComVisible
  • باستخدام ExpandoObject
  • باستخدام أ List<KeyValuePair<string,object>>
  • باستخدام امتداد List<KeyValuePair<string,object>> التي تم وضع علامة عليها ComVisible

هل هناك طريقة ما لتمرير تخصيص ObjectForScripting في WPF WebBrowser أنني في عداد المفقودين؟

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

المحلول

لست متأكدًا مما تقصده بـ "قابل للتخصيص"، ولكن هناك العديد من الطرق لإنجاز ما تريد تحقيقه، مثل إنشاء غلاف لقاموسك وجعله ObjectForScripting الخاص بك:

[ComVisible(true)] 
public class ScriptingContext 
{
    private Dictionary<string, object> objectsForScripting;
    public object GetValue(string s) 
    {
        return objectsForScripting[s];
    }
}

مع جافا سكريبت المقابلة window.external.GetValue("lookup").getValue(someId).

لاحظ أنه يمكنك أيضًا تمرير كائنات ComVisible إلى جافا سكريبت من خلال طريقة InvocScript والتفاعل معها بهذه الطريقة، باستخدام شيء مثل webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject) وإدارة الكائنات التي تعرضها على جانب جافا سكريبت.

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