【问题标题】:MediaElement - can't change sources from outside SilverlightMediaElement - 无法从 Silverlight 外部更改来源
【发布时间】:2011-09-09 15:21:14
【问题描述】:

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

【问题讨论】:

    标签: c# javascript silverlight mediaelement silverlight-5.0


    【解决方案1】:

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

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

    【讨论】:

    • 如果您愿意分享一点代码,它可能有助于说明您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2011-03-10
    • 2012-08-27
    • 2013-03-13
    • 2016-01-01
    相关资源
    最近更新 更多