Sembra che quello che hai è la migliore scommessa per ora. Vuoi mantenere i tuoi collegamenti al minimo, ma deve esserci una connessione tra la barra di avanzamento e il video player, quindi almeno uno ha bisogno di un riferimento all'altro. Avere tutte le connessioni in un controller significa lavorare di più quando un elemento vuole parlare con un altro.
Gli eventi non ti salveranno. Se una dozzina (o anche due) elementi diversi, sconosciuti al giocatore, necessitavano di aggiornamenti regolari sul progresso, un evento sarebbe la cosa giusta. Tieni presente che il player ora sposterà l'evento anziché chiamare un metodo della barra di avanzamento, quindi ti troverai praticamente in difficoltà. (Ma ora è più difficile capire chi viene informato.) Ecco, penso che una semplice chiamata di metodo sia migliore.
L'elegante soluzione - quella che probabilmente si muove nella parte posteriore della tua testa che ti ha portato a fare questa domanda - sarebbe quella di invertire la responsabilità e fare in modo che la barra di progresso chieda al giocatore cosa il progresso è Ciò elimina il giocatore - non deve preoccuparsi di quando effettuare le chiamate - anche se deve avere le informazioni di avanzamento sempre pronte. Non ci sono eventi di fantasia, solo un metodo semplice che qualcuno chiama else . E al giocatore non importa quanti altri elementi chiamano il metodo, o quando, o perché.
Il lato negativo è che la barra di avanzamento deve eseguire un timer per mantenere le cose in movimento. Ma il giocatore avrebbe dovuto fare qualcosa di simile: il lavoro e la responsabilità sono ora concentrati a cui appartengono.
Non sono sicuro che tu abbia ancora bisogno di questa soluzione "elegante", ma penso che sia la direzione in cui vorresti muoverti più tardi.
(Se lo usi, assicurati di eseguire tutto su EventQueue, o sulla coda UI, o qualunque sia la tua lingua lo chiami - in ogni caso, mantieni tutto su un thread. difficile, e nella maggior parte dei casi l'interfaccia utente funziona solo sul proprio thread comunque.)