تمرير القاموس إلى ObjectForScripting باستخدام WPF WebBrowser
-
11-12-2019 - |
سؤال
أنا أستخدم أ 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)
وإدارة الكائنات التي تعرضها على جانب جافا سكريبت.