我设法解决了这个问题:我创建了一个可从 JavaScript 编写脚本的 EntryPoint 类。当 JavaScript sendCommand 被触发时,它会将命令和 args 放入入口点持有的队列中。Silverlight 应用程序中计时器的每一次滴答,应用程序都会检查队列的 Count() 并获取任何命令并处理它们。
从Javascript,我打电话silverlightControl.Context.EntryPoint.setCommand("commandname", "args").
在入口点我有
[ScriptableMember()]
public string setCommand(string commandValue, string argsValue)
{
commands.Enqueue(commandValue);
args.Enqueue(argsValue);
commandWaitingFlag = true;
return Application.Current.HasElevatedPermissions.ToString();
}
在 Silverlight 本身中,我有一个间隔为 100 毫秒的 DispatcherTimer。这有一个滴答事件:
public void Each_Tick(object o, EventArgs e)
{
//Other code
if (entryPoint.commandWaitingFlag)
{
handleEntryPointCommands();
}
}
从内部handleEntryPointCommands
我调用 entryPoint 的一个方法getCommand()
:
public string[] getCommand() {
string commandOut = string.Empty;
string argsOut = string.Empty;
if (commands.Count > 0)
{
commandOut = commands.Dequeue();
argsOut = args.Dequeue();
if (commands.Count == 0)
{
commandWaitingFlag = false;
}
return new string[2] { commandOut, argsOut };
}
else
{
return new string[2];
}
}
然后可以使用我喜欢的命令。希望这对一些代码更有帮助。