Bonsoir à tous
Petite présentation :
Je suis le développeur d'un projet open source media center pour la freebox, le web et le PC, et ma petite idée est de migrer le moteur de rendu de la version PC vers WPF.
Je vous présente ma question, puis vous explique en gros le contexte :
"Comment faire en sorte qu'une source de données ait des paramètres qui proviennent d'une autre source de données?"
Petit screen :
Pour plus de détails et de screens, vous pouvez voir ce lien : http://forum.freebrowser.fr/viewtopic.php?t=2276
(il ne s'agit que de la version freebox, la version PC étant justement en cours de dev)
La technique :
Le logiciel utilise un système de skin accompagné par l'achitecture qui définie ces axes :
- Une couche de plugins qui permet d'alimenter en contenu. Le contenu est organisé de manière arborescente, ex pour le plugin permettant d'afficher la liste des répertoires, fichiers, lecteurs :
- Un langage de template capable d'interroger en live les plugins et organiser leur contenu dans la page de rendu final.
Ex (pour un rendu HTML orienté freebox) :
- D'autres couches comme le media player interchangeable, l'interface de configuration qui peut etre un serveur HTTP, un menu déroulant via une icône dans le systray ou tout autre chose, et la couche de présentation qui permet justement de gérer les différentes interfaces : freeplayer, web, Standalone WPF.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 <content Type=Jukebox> <table> <CM.Content.Jukebox.Album> <tr> <td> <u>Nom de l'album : <CM.Content.Jukebox.Album.AlbumName/></u> </td> </tr> <tr> <td> <b>Liste des musiques :</b> </td> </tr> <CM.Content.Jukebox.Album.Song> <tr> <td> <CM.Content.Jukebox.Album.Song.SongNumber/> - <CM.Content.Jukebox.Album.Song.SongName/> </td> </tr> </CM.Content.Jukebox.Album.Song> </CM.Content.Jukebox.Album> </table> </content>
Chaque couche est composée de plugins (ont peut donc facilement ajouter de nouveaux composants pour chaque couche) :
- freeBrowser.ViewControl.Freeplayer.dll
- freeBrowser.ViewControl.Standalone.dll
- freeBrowser.ViewControl.Web.dll
- freeBrowser.Plugin.Browser.dll
- freeBrowser.Plugin.Playlist.dll
- freeBrowser.Plugin.Jukebox.dll
(plus de 30 plugins)
- freeBrowser.ConfigManager.Win32Systray.dll
- freeBrowser.ConfigManager.HttpServer.dll
- freeBrowser.MediaPlayer.VLC.dll
au milieu de tout ca, il y'a un noyau qui charge toutes les couches au démarrage.
L'application est développée en .net 2.0 / mono
Voila pour le petit tour d'horizon technique.
Maintenant la question :} :
[B]La Question : [B]
Pour la version PC qui utilisera XAML, il y'aura toujours un système de skin qui chargra les fichiers .xaml depuis le disque pour les interpréter dynamiquement.
Ma question porte sur la gestion des données.
En WPF il existe plusieurs objets dont un qui m'interesse plus particulièrement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <XmlDataProvider x:Key="data" Source="/Data/MaSource.xml" />
Mon idée est de pouvoir faire des skins entièrement en XAML, sans utiliser le langage de template que j'ai développé pour l'occasion. Cela permettra de faire des skins directement avec Expression Blend (anciennement Interactive designer).
L'idée est de sous classer le XmlDataProvider afin qu'il ait 2 rôles :
1 : Un fournisseur de données au format XML (donc arborescent), tout comme l'est XmlDataProvider, en spécifiant une ressource via la propriété Source= . Cela est utile pour pouvoir designer une skin avec du contenu factice afin d'avoir une idée du rendu final.
2 : 2 nouvelles propriétés (c'est sur ces propriétés que portent ma question, j'y arrive enfin :} )
ContentType= , pour définir quel est le plugin à interroger. Ex :
ContentType="Files" ou en core ContentType="Jukebox"
ContentParameters= , pour définir les paramètres du plugin. Par exemple pour spécifier le répertoire courant pour le plugin Files.
C'est sur ce paramètre que ma question se pose.
Je voudrais pouvoir binder depuis une autre source de données le contenu de ContentParameters, Cela donnerait un code dans ce genre là :
<fB:fB_XmlDataProvider
x:Key="dataFiles"
Source="\XmlData\Files.xml"
ContentType="Files"
ContentParameters="{Binding Mode=Default,
Source={StaticResource dataParameters},
XPath=CurrentDirectory}" />
dataParameters est une autre source de données.
Cette syntaxe ne fonctionne pas, car la propriété ContentParameters n'est pas de type DependecyProperty.
De plus on ne peut mettre des propriétés de type DependencyProperty que dans des objets qui héritent de DependencyObject
, ce qui n'est pas mon cas car je sous classe XmlDataProvider :/
Mon autre idée était de composer avec une autre classe qui elle porte des propriétés DepencyProperty, mais cela ne semble pas fonctionner non plus :/
Pour résumer :
"Comment faire en sorte qu'une source de données ait des paramètres qui proviennent d'une autre source de données?"
Il y'a peut etre un élément de réponse du côté de DataObjectProvider qui est capable de gérer une liste de paramètres, mais là non plus ca ne semble pas non plus bindable.
Merci d'avance pour les réponses, je sais que la question est assez pointue, c'est pour cela que j'ai voulu être le plus exhaustif sur la question, en espérant que ca ne rebutera pas les forumeurs![]()
Partager