Pregunta

Estoy haciendo una aplicación de Silverlight y estoy usando un medieelement para reproducir un video del disco del usuario que conozco el camino de (digamos, "C: /foo.mov"). Me gustaría un desencadenante de JavaScript del navegador para cambiar la fuente del medieve a otro archivo conocido (por ejemplo, "c: /bar.mov"). Puedo hacer un botón para hacer esto en Silverlight, y puedo tener un código de ejecución de activación de JavaScript dentro de la aplicación Silverlight, pero cuando lo hago, el medieve parece vacío.

Incluso he intentado que JavaScript llame al evento btnloadnewmediatest_click, y aunque ese evento funciona bien llamado desde el usuario hace clic en el botón, no afecta a los medios cuando se llama desde fuera de la aplicación.

Mirando el medianoelemento en la depuración, parece que cuando se llama desde el JavaScript, la fuente del medioelemento parece nulo y parece haber hecho una copia vacía.

Puedo confirmar que JavaScript está desencadenando los eventos en Silverlight, ya que tropieza con puntos de interrupción en el código Silverlight.

¿Fue útil?

Solución

He logrado resolver esto: creé una clase de EntryPoint que es scriptable de JavaScript. Cuando se activa el JavaScript SendCommand, pone un comando y argumenta en una cola sostenida por el punto de entrada. Cada tic de un temporizador en la aplicación Silverlight, la aplicación verifica el recuento () de la cola y obtiene cualquier comando y procesa.

Del JavaScript, llamo silverlightControl.Context.EntryPoint.setCommand("commandname", "args").

En el punto de entrada tengo

[ScriptableMember()]
    public string setCommand(string commandValue, string argsValue)
    {
        commands.Enqueue(commandValue);
        args.Enqueue(argsValue);
        commandWaitingFlag = true;
        return Application.Current.HasElevatedPermissions.ToString();
    }

En el propio Silverlight, tengo un despacho con un intervalo de 100 ms. Esto tiene un evento de tick:

    public void Each_Tick(object o, EventArgs e)
    {
        //Other code
        if (entryPoint.commandWaitingFlag)
        {
            handleEntryPointCommands();
        }
    }

Desde adentro handleEntryPointCommands Llamo un método del punto de entrada, 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];
        }
    }

Y luego puedo usar el comando que he recibido como me guste. Esperemos que eso sea más útil con algún código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top