Question

Je crée une application Silverlight et j'utilise un MediaElement pour lire une vidéo à partir du disque de l'utilisateur dont je connais le chemin (par exemple, "C: /foo.MOV").Je voudrais un déclencheur Javascript du navigateur pour changer la source du MediaElement en un autre fichier connu (par exemple "C: /bar.MOV").Je peux créer un bouton pour le faire dans Silverlight, et je peux avoir un code d'exécution de déclencheur Javascript dans l'application Silverlight, mais quand je le fais, le MediaElement apparaît vide.

J'ai même essayé de demander au Javascript d'appeler l'événement btnLoadNewMediaTest_Click, et bien que cet événement fonctionne correctement appelé à partir des clics de l'utilisateur sur le bouton, il n'affecte pas du tout le média lorsqu'il est appelé de l'extérieur de l'application.

En regardant le MediaElement dans le débogage, il semble que lorsqu'il est appelé à partir du Javascript, la source de MediaElement apparaît comme nulle et il semble avoir fait une copie vide.

Je peux confirmer que Javascript déclenche les événements dans Silverlight, car il déclenche des points d'arrêt dans le code Silverlight.

Était-ce utile?

La solution

J'ai réussi à résoudre ce problème: j'ai créé une classe EntryPoint qui est scriptable à partir de JavaScript.Lorsque JavaScript sendCommand est déclenché, il place une commande et des arguments dans une file d'attente détenue par le point d'entrée.À chaque tick d'une minuterie dans l'application Silverlight, l'application vérifie le nombre () de la file d'attente et obtient toutes les commandes et les traite.

À partir du Javascript, j'appelle silverlightControl.Context.EntryPoint.setCommand("commandname", "args").

Dans le point d'entrée que j'ai

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

Dans le Silverlight lui-même, j'ai un DispatcherTimer avec un intervalle de 100 ms.Cela a un événement tick:

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

De l'intérieur handleEntryPointCommands, j'appelle une méthode de 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];
        }
    }

et puis peut utiliser la commande que j'ai obtenue comme je veux.J'espère que cela sera plus utile avec du code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top