2010-09-23 7 views
1

Je suis en train de supprimer le code XAML de mon projet Silverlight et de le faire utiliser uniquement du code (selon this article).Silverlight sans XAML fait échouer les URI source?

Voici mon événement de démarrage très simple pour une application Silverlight (avec le App.xaml standard à partir du modèle de projet):

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    Grid grid = new MainPage(); 
    this.RootVisual = grid; 

    var mediaElement = new MediaElement(); 
    mediaElement.MediaFailed += (s, ea) => { mediaFailed = true; }; 
    mediaElement.Source = new Uri(@"/Content/Some Music.mp3", UriKind.Relative); 
    grid.Children.Add(mediaElement); 
} 

Lorsque le fichier MP3 est réglé sur « Build Action: Aucune, Copier si plus récent "(ie: c'est à côté du XAP). Voici le XAML pour MainPage:

<Grid x:Class="TestGame.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
</Grid> 

Et le C# - rien d'inhabituel ici du tout.

public partial class MainPage : Grid 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 
} 

Tout cela fonctionne jusqu'à maintenant. Donc, ma question est la suivante: pourquoi est-ce que quand je change

Grid grid = new MainPage(); 

à

Grid grid = new Grid(); 

l'événement mediaElement.MediaFailed est appelé (avec un AG_E_NETWORK_ERROR)?

La seule chose intéressante que fait InitializeComponent appelle Application.LoadComponent (c'est le code généré par défaut). Alors, que pourrait faire cette fonction qui permet aux URI source de fonctionner? Il semble que Application.GetResourceStream fonctionne encore très bien. Mais je dois pouvoir obtenir quelques ressources externes au XAP.

(Note:. Il semble this guy est d'avoir le même problème - mais personne n'a répondu à sa question)

+0

Je ne suis pas capable de reproduire ce problème, où se trouve le dossier "Content" relatif au dossier "ClientBin" contenant le Xap? Est-ce que l'enfant ou un frère ou une soeur? – AnthonyWJones

+0

@Anthony: Je n'ai pas de dossier ClientBin - c'est un projet autonome exécuté à partir du système de fichiers. Le dossier Content est un frère ou une sœur du XAP. –

Répondre

1

Le facteur clé est UriKind.Relative. La question est de savoir ce qui est relatif?

L'un des effets de LoadComponent est qu'il déplace l'emplacement de "/". Avant que LoadComponent exécute le chemin "/" fait référence au même emplacement que dans le navigateur hôte. Après LoadComponent "/" fait référence à un hybride du contenu racine de Xap et le dossier qui contient le Xap. Puisque vous exécutez ceci via un test autonome, la page html "/" dans votre deuxième exemple fait référence à la racine du lecteur physique, par ex. "c: \". Si vous modifiez l'URL en "Content/Some Music.mp3" (c'est-à-dire supprimez le préfixe "/") et en supposant que votre page html de test est le même dossier que le Xap, cela devrait fonctionner comme prévu.

Notez que vous ne pouvez pas échapper le chemin hybride avec le chemin parent "..", Silverlight ne vous laisse pas faire cela.

+0

Merci pour l'explication. Pour la référence de tous, voici la http://msdn.microsoft.com/library/cc296240(VS.95).aspx documentation votre réponse me conduit aussi (je vais devoir le relire moi-même plus tard, c'est assez obtus et je ne comprends pas encore tout à fait).Je pense que dans mon cas, je devrai avoir du XAML - parce que mon XAP déployé (et le contenu associé) sera référencé à partir du HTML à une URL non spécifiée. –

Questions connexes