Bonsoir ! J'ai hérité d'un projet plutôt complexe, celui de reproduire une application de type "DeskAlert" : écrire un message dans une interface web en définissant des critères (importance, destinataires…), pour qu'un terminal client affiche celui ci sous la forme choisie (popup ou bandeau défilant). Cette situation est d'autant plus complexe que je suis encore novice et que je n'ai pas de référent en dev sur ce projet (pas d'aide directe). Et en bonus pas de web sur mon poste de dev (rigolo quand l'extension est uniquement sous nuget). Malgré tout, je touche presque au but, en ayant développé un Webapp Mvc, un service WCF, une base SQL et un terminal WPF (environnement .NET donc).
Il y a une mécanique ou je suis réellement en difficulté. C'est de la gestion de la vue du bandeau défilant avec le terminal WPF. Je tente d'adapter une partie de ce projet : Ticker WPF pour qu'il puisse me lire mes données directement de mon service WCF plutôt que d'un flux RSS. Ce projet fonctionne avec le Framework Caliburn Micro, et je tente de l'adapter pour MVVM light, le framework que j'utilise.
Voici un extrait du ViewModel initial :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [ImportingConstructor] public MainViewModel() { manager.NewFeedItem += (o, e) => Execute.BeginOnUIThread(() => AddItem(e.Item)); DTimer dtimer = new DTimer(); dtimer.Start(10); } protected override void OnViewLoaded(object view) { ticker = new Ticker<TickerItemView>(((MainView)view).LayoutRoot); ticker.Speed = new TimeSpan(0, 1, 0); ticker.ItemDisplayed += ticker_ItemDisplayed; manager.Start(); ticker.Start(); } |
-Le premier problème : Tout s’exécute dés le lancement du projet>affichage de la vue et démarrage du bandeau
-Le deuxième : Le Framework Caliburn detecte la vue ouverte et y place l'usercontrol servant de cadre au bandeau, et l'usercontrol servant d'objet de lecture pour le bandeau
Ce sont ces deux mécaniques je dois arriver à reproduire avec Mvvm light.
Ma tentative :
Première différence, je n'ai pas de vue de "base". C'est un timer qui va toute les 5 minutes, vérifier, si un message est disponible sur le serveur. Si c'est le cas, il récupère une liste, et va instancier la vue qu'il faut. Mon responsable veut que ce soit le terminal client qui aille chercher et pas le serveur qui envoie.
Extrait du Timer
1 2 3 4 5 6 7 8 9 10 11 | if (service.IsAlertForMe(myIP) == true) { MessageBox.Show("That for you !"); TickerLayout tick = new TickerLayout(); tb = App.Current.Resources["NotifyIcon"] as TaskbarIcon; tb.ShowCustomBalloon(tick, PopupAnimation.Slide, 40000); } else { MessageBox.Show("Rien pour toi !"); } |
L'objectif est ici d'afficher le Layout du bandeau et d'y charger l'objet servant à la lecture. C'est le soucis, je ne sais pas comment avec Mvvm light, charger un contrôle dans un contrôle. J'ai fais un test avec un relaycommand, mais je n'ai pas mon message, mon contrôle "TickerNormalView" ne se charge pas.
Extrait de mon ViewModel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private Ticker<TickerNormalView> ticker; private readonly IDataService _dataService; public RelayCommand TickerItemLoaded { get; private set; } private void OnTickerLoaded() { MessageBox.Show("TickerItem chargé !"); TickerLayout layout = new TickerLayout(); ticker = new Ticker<TickerNormalView>(layout.LayoutRoot); ticker.Speed = new TimeSpan(0, 1, 0); manager.Start(); ticker.Start(); } public TickerViewModel(IDataService dataService) { _dataService = dataService; TickerItemLoaded = new RelayCommand(() => OnTickerLoaded()); } |
J'ai une belle pelote, et je ne sais pas trop comment la dérouler. Je vais poser une question bête mais j'instancie donc deux fois mon objet TickerLayout (dans mon timer et dans mon viewmodel), j'imagine que cela n'est pas une bonne pratique.
J'ai besoin d’assistance pour savoir: -Revenir sous Caliburn -Tenter de fusionner Mvvm light et Caliburn(sachant que l'un et l'autre auront des actions bien distinctes) -Rester avec ma situation actuelle
J’espère que vous pourrez éclairer ma lanterne ! Cordialement.