Совместимость Silverlight и Flash Javascript Bridge - PullRequest
2 голосов
/ 23 декабря 2010

Я разрабатываю замену Silverlight4 для существующего Flash-клиента.Я хотел бы сохранить совместимость с существующими функциями JavaScript моста HTML Flash, но не могу понять, как предоставить интерфейс javascript непосредственно в клиентском объекте Silverlight вместо отдельного объекта.

В Flash этоМожно вызвать Bar () непосредственно для объекта клиента, например:

var flashClient = document.GetElementById(_currentFlashId);  
flashClient.Bar(); 

Но в Silverlight я не нашел средства для вызова интерфейса непосредственно для объекта Silverlight.Вместо этого кажется, что интерфейсы могут быть доступны только для содержащихся объектов, как в:

var silverlightClient = document.GetElementById(_currentSilverlightId);
silverlightClient.Foo.Bar();

Там, где вышеуказанный объект "Foo" кажется обязательным, поскольку

RegisterScriptableObject("Foo", MyFooObject);

не можетвызываться с нулевым первым параметром.

Итак, в Silverlight есть ли способ просто иметь:

silverlightClient.Bar();

?

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Если вам нужен объект с совместимым интерфейсом, вы можете просто сделать это:

var silverlightClient = document.GetElementById(_currentSilverlightId).Foo;
0 голосов
/ 30 декабря 2011

Есть несколько трудоемкий способ сделать это (я в той же ситуации - пытаюсь удалить прямую замену Silverlight приложения Flash).

Для каждого [ScriptableMember] вызывайте метод BackBind с числом параметров после вызова HtmlPage.RegisterScriptableObject("Foo", MyFooObject);

Метод BackBind:

void BackBind(string methodName, int argCount) {
    var id = HtmlPage.Plugin.Id;
    var sb = new StringBuilder();
    sb.Append("var x = document.getElementById('");
    sb.Append(id);
    sb.Append("'); x.");
    sb.Append(methodName);
    sb.Append(" = function(");

    for (int i = 0; i < argCount; i++) {
        if (i > 0) sb.Append(',');
        sb.Append((char)('A' + i)); // if you have more than 26 arguments, improve this!
    }

    sb.Append("){return x.content.");
    sb.Append(ScriptRegistration);
    sb.Append(".");
    sb.Append(methodName);
    sb.Append("(");

    for (int i = 0; i < argCount; i++) {
        if (i > 0) sb.Append(',');
        sb.Append((char)('A' + i)); // if you have more than 26 arguments, improve this!
    }

    sb.Append(");};");
    HtmlPage.Window.Eval(sb.ToString());
    // calls something like:  var x = document.getElementById('my_id'); x.Bar = function(a,b){return x.content.Foo.Bar(a,b);};
}

Пример использования:

public class MyFooObject {
    const string ScriptRegistration = "Foo";
    public MyFooObject () {
        HtmlPage.RegisterScriptableObject(ScriptRegistration, this);
        BackBind("Bar", 2);
        BackBind("Baz", 0);
    }

    [ScriptableMember]
    public void Bar(string a, int b) { /* stuff */ }

    [ScriptableMember]
    public string Baz() { return "stuff"; }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...