Laden...

Wie kann ich ein Event in einer Form in einer anderen Form verfügbar machen?

Erstellt von Timme vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.311 Views
T
Timme Themenstarter:in
4 Beiträge seit 2020
vor 4 Jahren
Wie kann ich ein Event in einer Form in einer anderen Form verfügbar machen?

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)
        {
           
            
        }
    }
}

J
251 Beiträge seit 2012
vor 4 Jahren

Hallo,

evtl. hilft dir folgendes weiter: [FAQ] Kommunikation von 2 Forms

T
Timme Themenstarter:in
4 Beiträge seit 2020
vor 4 Jahren

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

16.806 Beiträge seit 2008
vor 4 Jahren

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.

T
Timme Themenstarter:in
4 Beiträge seit 2020
vor 4 Jahren

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

B
22 Beiträge seit 2018
vor 4 Jahren

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);
        }

Edit: Hilfreicher Link zu Ereignissen

T
Timme Themenstarter:in
4 Beiträge seit 2020
vor 4 Jahren

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