MediaElement - 无法从Silverlight外部更改源

时间:2011-09-09 15:21:14

标签: c# javascript silverlight mediaelement silverlight-5.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代码中触发断点。

1 个答案:

答案 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];
        }
    }

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