0

我正在制作一个 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 代码中的断点。

4

1 回答 1

0

我设法解决了这个问题:我创建了一个可从 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];
        }
    }

然后可以使用我喜欢的命令。希望这对一些代码更有帮助。

于 2011-09-23T08:24:52.690 回答