我正在制作一个Silverlight应用程序,我正在使用MediaElement来播放用户磁盘上的视频,我知道它的路径(例如“C:/foo.MOV”)。我想从浏览器触发Javascript触发器将MediaElement的源更改为另一个已知文件(例如“C:/bar.MOV”)。我可以在Silverlight中创建一个按钮,我可以在Silverlight应用程序中有一个Javascript触发器执行代码,但是当我这样做时,MediaElement显示为空。
我甚至试过让Javascript调用btnLoadNewMediaTest_Click事件,并且当用户点击按钮时该事件工作正常,但从应用程序外部调用时它根本不会影响媒体。
在调试中查看MediaElement,似乎当从Javascript调用它时,MediaElement的Source显示为null并且它似乎已经制作了一个空副本。
我可以确认Javascript是在Silverlight中触发事件,因为它会在Silverlight代码中触发断点。
答案 0 :(得分:0)
我设法解决了这个问题:我创建了一个可以从JavaScript编写脚本的EntryPoint类。当触发JavaScript sendCommand时,它会将命令和args放入入口点所持有的队列中。应用程序在Silverlight应用程序中每次打勾,应用程序都会检查队列的Count()并获取任何命令并对其进行处理。
在Javascript中,我致电silverlightControl.Context.EntryPoint.setCommand("commandname", "args").
在EntryPoint中我有
[ScriptableMember()]
public string setCommand(string commandValue, string argsValue)
{
commands.Enqueue(commandValue);
args.Enqueue(argsValue);
commandWaitingFlag = true;
return Application.Current.HasElevatedPermissions.ToString();
}
在Silverlight本身,我有一个间隔为100毫秒的DispatcherTimer。这有一个tick事件:
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];
}
}
然后可以使用我得到的命令但是我喜欢。希望这对某些代码更有帮助。