Moin, ich bin noch ganz frisch in c# .
Ich nutze VisualStudio 2019 als IDE falls das relavant werden sollte.
zum Problem:
Ich erstelle, in einer zweiten Form, ein "MediaPlayer" Object mit Hilfe der LibVLCSharp.Shared.
Das "MediaPlayer" Object hat mehrere Events die ich in der ersten Form auslösen möchte
z.B. für ne Progressbar , Timeleft anzeige.
das Event in der zweiten Form kann ich problemlos registrieren aber ich hab keine Schimmer wie ich ihn in der ersten Form Verfügbar mache.
Beide Forms sollen übrigends über die komplette Laufzeit erhalten bleiben.
hoffe ich hab das Thema hier Richtig erstellt
LG Timme
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;
using System.IO;
using LibVLCSharp.Shared;
using Xamarin.Forms;
namespace SG
{
public partial class MainGui : Form
{
public MainView newMainView = new MainView();
private LibVLC _libVLC;
public MainGui()
{
InitializeComponent();
CheckMonitors();
}
private void CheckMonitors()
{
int MonitorCount = System.Windows.Forms.SystemInformation.MonitorCount;
if (MonitorCount <= 1)
{
MessageBoxButtons buttons = MessageBoxButtons.OK;
string caption = "Monitore";
MessageBox.Show("Es wurde nur ein Monitor gefunden, sie bedindet sich im Konfigurations Modus!",caption, buttons);
}
else
{
Screen[] screens = Screen.AllScreens;
newMainView = new MainView();
newMainView.Show();
newMainView.Location = Screen.AllScreens[1].WorkingArea.Location;
newMainView.WindowState = FormWindowState.Maximized;
//newMainView.TopMost = true;
}
}
private void sendText_Click(object sender, EventArgs e)
{
newMainView.Start_Content(@"F:\Movies\test.mkv", true);
}
private void StopVideo_Click(object sender, EventArgs e)
{
newMainView.Stop_Playback();
this.progressBar1.Value = 0;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using LibVLCSharp.Shared;
namespace SG
{
public partial class MainView: Form
{
private LibVLC _libVLC;
private MediaPlayer _mp;
public MainView()
{
Core.Initialize();
InitializeComponent();
}
public void Start_Content(string DateiPfad,bool isMuted= true )
{
_libVLC = new LibVLC();
_mp = new MediaPlayer(_libVLC);
videoView1.MediaPlayer = _mp;
string media = DateiPfad;
_mp.Play(new Media(_libVLC, media, FromType.FromPath));
if (isMuted != true) _mp.ToggleMute();
//Mediplayer Event Registrieren
_mp.TimeChanged += _mp_TimeChanged;
}
public long getTime()
{
long VideoTime = _mp.Length;
return VideoTime;
}
public void Toggle_Mute()
{
_mp.ToggleMute();
}
public void Stop_Playback()
{
_mp.Stop();
}
void _mp_TimeChanged (object sender, MediaPlayerTimeChangedEventArgs a)
{
}
}
}
Hallo,
evtl. hilft dir folgendes weiter: [FAQ] Kommunikation von 2 Forms
Hi, den Beitrag hab ich natürlich schon gefunden und ich sitz da auch schon 2 Tage davor ,was nicht heißt das die Lösung nicht trotzdem darin verborgen liegen kann, nur leider bekomme ich es in diesem Fall einfach nicht hin.
LG Timme
Okay. Und was genau verstehst Du nicht? Wo kommst Du nicht weiter?
Der FAQ Eintrag behandelt exakt Dein Problem mit Erklärung und Beispielcode.
Auf "ich bekomm es nicht hin" ist es halt als Helfer auch nur schwer irgendwas zu antworten.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
ich habe jetzt...
public event EventHandler _VideoTimeChanged;
protected virtual void On_VideoTimeChanged(EventArgs a)
{
_VideoTimeChanged?.Invoke(this, a);
}
public void Start_Content(string DateiPfad,bool isMuted= true )
{
string media = DateiPfad;
_mp.Play(new Media(_libVLC, media, FromType.FromPath));
if (isMuted != true) _mp.ToggleMute();
On_VideoTimeChanged(EventArgs.Empty);
}
... in der zweiten Form/Klasse Definiert
aber wo bzw wie übergebe ich das Object Event
_mp.TimeChanged
ich fürchte ich hab da etwas grundsätzliches nicht verstanden -.-
LG Timme
Das sieht doch schonmal nicht schlecht aus.
Aber du muss das Event TimeChanged deines MediaPlayer Objekts trotzdem abbonieren. Wenn dieses Ausgelöst wird kanns du wiederum dein neues VideoTimeChanged auslösen. Und genau dieses Event sollte auch deine Form1 abonniert haben. So bekommt diese auch Kenntnis über das Ereignis. Sprich was du machst ist eine Kettenreaktion auslösen.
MediaPlayer Ereignis löst Ereignis in Form 2 aus welche von deiner Form 1 abonniert wurde.
Form 1
Screen[] screens = Screen.AllScreens;
newMainView = new MainView();
newMainView.Show();
newMainView.On_VideoTimeChanged += newMainView_On_VideoTimeChanged
newMainView.Location = Screen.AllScreens[1].WorkingArea.Location;
newMainView.WindowState = FormWindowState.Maximized;
Form 2
public event EventHandler _VideoTimeChanged;
protected virtual void On_VideoTimeChanged(EventArgs a)
{
_VideoTimeChanged?.Invoke(this, a);
}
public void Start_Content(string DateiPfad, bool isMuted = true)
{
string media = DateiPfad;
_mp.Play(new Media(_libVLC, media, FromType.FromPath));
if (isMuted != true)
{
_mp.ToggleMute();
}
_mp.TimeChanged += _mp_TimeChanged;
}
void _mp_TimeChanged(object sender, MediaPlayerTimeChangedEventArgs a)
{
On_VideoTimeChanged(EventArgs.Empty);
}
Perfekt die Antwort von Brymax hat mir geholfen,
inzwischen bin ich n ganzes stück weiter
und komme auch langsam mit customargs klar 😉
Dir und auch allen andern vielen Dank
LG Timme