Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

11

05.07.2013, 19:38

Das war an keinen persönlich gerichtet. Vor allem nicht an dich. Mir wär zumindest noch nicht aufgefallen, dass du immer wieder Einsteigern WPF empfehlen würdest. Sorry wenn das so rüber gekommen ist.

Aber um beim eigentlichen Thema zu bleiben: Wenn dir, MitgliedXYZ, DataBinding kein Begriff ist, dann solltest du dich mal darüber (am besten direkt in Verbindung mit dem MVVM-Pattern) informieren. Denn erst dann ist es überhaupt sinnvoll WPF zu benutzen. Events gibt es in WinForms genau so ;)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

12

05.07.2013, 19:56

Ohne DataBindings lass die Finger von WPF, dann missbrauchst du das Framework nur. WPF ist für eine MVVM-Architektur gedacht und dafür auch ideal. alles andere nimm bitte Winforms. Wenn du beim Verlassen des Fensters speichern möchtest, wäre, das Closed-Event korrekt. Das kannst du einfach wie folgt machen:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
public MainWindow()
{
    InitializeComponent();
    Closed += OnMainWindowClosed;
}

private void OnMainWindowClosed(object sender, RoutedEventArgs e)
{
   //speichere deine Einstellungen.
}


Welchen Anwendungsfall hast du denn, dass du etwas beim schließen gespeichert wird? Wenn man es übrigens korrekt nach MVVM bauen möchte, muss man beim schliessen des Fensters etwas tricksen.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

13

05.07.2013, 21:31

Modal heißt, dass nur dieser Dialog aktuell angewählt werden kann und der darunter nicht in den Vordergrund geholt werden kann - laienhaft gesprochen.
Ich gehe aber davon aus, dass Du ihn genau so verwendest. Und wenn der Dialog geschlossen wird, kannst Du die Eigenschaften von diesem doch einfach abfragen. Ob er geschlossen wurde oder nicht, ist erstmal egal, die Instanz an sich ist doch noch da und auch noch gültig.
Ok, danke für die Erklärung.
Da ich das Fenster mit ".ShowDialog()" öffne, ist es immer im Vordergrund, ja.
Heißt das, wenn der Dialog geschlossen wird, dass mein Dialog-Objekt immer noch die Werte z.b. in den Textboxen enthält? Das würde einiges erleichtern. Ich kann das leider jetzt nicht testen, bin am Netbook.



Ohne DataBindings lass die Finger von WPF, dann missbrauchst du das Framework nur. WPF ist für eine MVVM-Architektur gedacht und dafür auch ideal. alles andere nimm bitte Winforms. Wenn du beim Verlassen des Fensters speichern möchtest, wäre, das Closed-Event korrekt. Das kannst du einfach wie folgt machen:









C#-Quelltext




1
2
3
4
5
6
7
8
9
10



public MainWindow()
{
InitializeComponent();
Closed += OnMainWindowClosed;
}

private void OnMainWindowClosed(object sender, RoutedEventArgs e)
{
//speichere deine Einstellungen.
}






Welchen Anwendungsfall hast du denn, dass du etwas beim schließen gespeichert wird? Wenn man es übrigens korrekt nach MVVM bauen möchte, muss man beim schliessen des Fensters etwas tricksen.
Ich habe meistens auch immer WindowsForms benutzt, aber einerseits wurde online sehr oft Wpf empfohlen und zudem hat auch die Firma in der ich ein Schülerpraktikum gemacht habe gesagt, dass niemand mehr WindowsForms benutzt und ich deswegen lieber auch Wpf verwenden sollte.

Hilft mir dein Code wirklich? Wenn, dann bräuchte ich es ja nur für das Einstellungs-Fenster und nicht fürs MainWindow. Aber dann würde ja wieder nur eine Methode in Einstellungen ausgeführt werden, MainWindow würde da ja dann auch nichts davon mitbekommen.
Und das Speichern von Anwendungseinstellungen ist doch weder in WindowsForms noch in Wpf ein Problem, dass kann man ja einfach so machen:

C#-Quelltext

1
Properties.Settings.Default.FirstUserSetting = "abc";

Im Einstellungsfenster kann man seine Zugangsdaten für den Server angeben. Diese sollen dauerhaft gespeichert bleiben, aber dennoch jederzeit über das Einstellungsfenster geändert werden können.

Aber um beim eigentlichen Thema zu bleiben: Wenn dir, MitgliedXYZ, DataBinding kein Begriff ist, dann solltest du dich mal darüber (am besten direkt in Verbindung mit dem MVVM-Pattern) informieren. Denn erst dann ist es überhaupt sinnvoll WPF zu benutzen. Events gibt es in WinForms genau so
Ok, dann werde ich mir dazu mal etwas durchlesen.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

14

06.07.2013, 13:48

Dass mit dem Closing Event funktioniert nun.

Ich habe aber auch ein UserControl mit einem Button, der auf dem Hauptfenster angezeigt wird. Nun werden aber zur Laufzeit je nach Fall unterschiedlich viele UserControl angezeigt. Wie kann ich überprüfen, welches UserControl angeklickt wurde?

Bei meinem UserControl sieht der Code zurzeit so aus:

C#-Quelltext

1
2
3
4
5
 public event EventHandler ButtonClick;

        protected void b1_Click(object sender, RoutedEventArgs e)
        {            if (this.ButtonClick != null)
                this.ButtonClick(this, e);          }



Und im MainWindow:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
  private void Window_Loaded(object sender, RoutedEventArgs e)  {
//...
MailItem[] mails = new MailItem[anzMails];
mails[0] = new MailItem();
mails[0].Absender = "Fritz@muser.de";
//...
stackPanel1.Children.Add(mails[0]);
mails[0].ButtonClick += new EventHandler(UserControl_ButtonClick);
//...
}
   protected void UserControl_ButtonClick(object sender, EventArgs e)        { 
 //... 
 }



Wie könnte ich das aber so umbauen, dass die Methode UserControl_ButtonClick weiß, welches Element aus dem Array "mails" es ausgelöst hat?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

15

06.07.2013, 16:40

Indem du ButtonClick nicht this, sondern den sender übergibst.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

16

06.07.2013, 17:21

Danke für die Antwort, aber entweder hab ich etwas falsch verstanden, oder es funktioniert nicht.

Das Usercontroll sieht jetzt so aus

C#-Quelltext

1
2
 if (this.ButtonClick != null)
                this.ButtonClick(sender, e);  



Und im MainWindow habe ich jetzt folgenden Code (der Rest ist mit dem vorher geposteten identisch)

C#-Quelltext

1
2
3
4
5
6
7
8
9
 protected void UserControl_ButtonClick(object sender, EventArgs e)

        {

            int buttonIndex = Array.IndexOf(mails, sender);

            MessageBox.Show(buttonIndex.ToString());

        }



Aber egal welches UserControl ich anklicke, ich sehe immer nur "-1". Woran könnte das liegen?

Ich glaube meine Frage ist mit dieser hier identisch, die Lösungsvorschläge von dort haben mich leider noch nicht viel weiter gebracht...
http://stackoverflow.com/questions/16111…e-control-array

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

17

06.07.2013, 17:25

Naja der sender ist natürlich der Button. Dementsprechend musst du dich noch nach oben hangeln bist du bei deinem UserControl angelang bist (Entweder im logischen Baum mit Parent oder im Visuellen mit der VisualTreeHelper-Klasse)

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

18

06.07.2013, 17:35

Mh, was meinst du genau?

Evtl. sollte ich doch mal meinen kompletten aktuellen Code posten.

MailItem.cs

C#-Quelltext

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
namespace MailSupport

{

    public partial class MailItem : UserControl

    {        public int MailID = 0;

        public string Betreff = "";
        public string Inhalt = "";

        public string Datum = "";

        public string Absender = "";

        public bool IstAusgewaehlt = false;

                public MailItem()

        {            InitializeComponent();


            AktualisiereDesign();

        }


        private void UserControl_Loaded(object sender, RoutedEventArgs e)

        {
        }


        public void AktualisiereDesign()

        {            tbAbsender.Text = Absender;

            tbBetreff.Text = Betreff;

            tbDatum.Text = Datum;

        }
        public event EventHandler ButtonClick;


        protected void b1_Click(object sender, RoutedEventArgs e)

        {            NachrichtAuswaehlen();


            if (this.ButtonClick != null)

                this.ButtonClick(sender, e);  

        }
        public void NachrichtAuswaehlen()

        {            IstAusgewaehlt = true;

            tbAbsender.Foreground = new SolidColorBrush(Colors.Blue);

            tbBetreff.Foreground = new SolidColorBrush(Colors.Blue);

            tbDatum.Foreground = new SolidColorBrush(Colors.Blue);

        }

        public void NachrichtNichtAuswaehlen()
        {            IstAusgewaehlt = false;

            tbAbsender.Foreground = new SolidColorBrush(Colors.Black);

            tbBetreff.Foreground = new SolidColorBrush(Colors.Black);

            tbDatum.Foreground = new SolidColorBrush(Colors.Black);

        }

    }}



Und MainWindow.cs

C#-Quelltext

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
namespace MailSupport{  

    public partial class MainWindow : Window

    {        int AktuelleMail;

        string EmailAdresse;

        string Benutzername;

        string Passwort;

        string Server;

        int AktualisierungsZeit;

        Einstellungen einstellung;

        MailItem[] mails;

        public MainWindow()        {
            InitializeComponent();        }

        private void scrollViewer1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
        }

        private void bSenden_Click(object sender, RoutedEventArgs e)        {
            MessageBox.Show("Senden");
        }
        private void bWeiterleiten_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Weiterleiten");
        }
        private void bLoeschen_Click(object sender, RoutedEventArgs e)
        {            MessageBox.Show("Löschen");
        }

        private void bMuster_Click(object sender, RoutedEventArgs e)
        {            MessageBox.Show("Musterbrief");
        }

        private void bWissen_Click(object sender, RoutedEventArgs e)
        {            MessageBox.Show("Wissensdatenbank");
        }

        private void bEinstellungen_Click(object sender, RoutedEventArgs e)
        {
            einstellung = new Einstellungen();
            einstellung.EinstellungClosing += new EventHandler(einstellung_closing);
            einstellung.ShowDialog();
        }

        protected void einstellung_closing(object sender, EventArgs e)
        {            EmailAdresse = Properties.Settings.Default.Email;
            Benutzername = Properties.Settings.Default.Benutzer;
            Passwort = Properties.Settings.Default.Passwort;
            Server = Properties.Settings.Default.Server;
            AktualisierungsZeit = Properties.Settings.Default.AktualisierZeit; 
        }

        private void bNeueMail_Click(object sender, RoutedEventArgs e)
        {            MessageBox.Show("NeueMail");
        }

        public void mailAuswahl(int id)
        {            AktuelleMail = 0;
        }

        public void LadeWarteschlange()        {        }


        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)        {
            MessageBox.Show("Anwendung wird beendet.");        }


        public void LadeEinstellungen()
        {            EmailAdresse = Properties.Settings.Default.Email;
            Benutzername = Properties.Settings.Default.Benutzer;
            Passwort = Properties.Settings.Default.Passwort;
            AktualisierungsZeit = Properties.Settings.Default.AktualisierZeit;
        }


        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            LadeEinstellungen();
            LadeWarteschlange();

            lBetreff.Text = "";
            lInhalt.Text = "";

            bSenden.Opacity = 0;
            bWeiterleiten.Opacity = 0;
            bLoeschen.Opacity = 0;
            bMuster.Opacity = 0;
            bWissen.Opacity = 0;
            bEinstellungen.Opacity = 0;
            bNeueMail.Opacity = 0;

            //Dies ist Testcode, zum Simulieren einiger eMails
            mails = new MailItem[10];
            mails[0] = new MailItem();
            mails[0].Absender = "Fritz@muser.de";
            mails[0].Datum = "17:00 04.07.3013";
            mails[0].Betreff = "Test eMail";
            mails[0].AktualisiereDesign();
            stackPanel1.Children.Add(mails[0]);
            mails[0].ButtonClick += new EventHandler(UserControl_ButtonClick);
            mails[1] = new MailItem();
            mails[1].Absender = "mustermann@beispielfirma.net";
            mails[1].Datum = "17:01 04.07.3013";
            mails[1].Betreff = "Zweite Test Mail";
            mails[1].AktualisiereDesign();
            stackPanel1.Children.Add(mails[1]);
            mails[1].ButtonClick += new EventHandler(UserControl_ButtonClick);
            //Ende des Testcodes
        }


        protected void UserControl_ButtonClick(object sender, EventArgs e)
        {            int buttonIndex = Array.IndexOf(mails, sender);
            MessageBox.Show(buttonIndex.ToString());
        }
    }}

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

19

06.07.2013, 17:44

Wenn du auf den Button clickst, dann ist "sender" in dem Event der Button und NICHT das MailItem, in dem der Button liegt.
Dementsprechend gibt es den sender natürlich nicht in deinem "mails" Array.

Du weißt aber, dass der Button ein Kind von dem MailItem ist. Also musst du einfach solange das übergeordnete Control (bzw dessen übergeordnetes) auswerten, bis du bei einem MailItem angekommen bist. Das kannst du dann benutzen um den Index in deinem Array damit zu berechnen.

Also so etwas wie

Quellcode

1
2
3
4
5
6
while( Parent is not MailItem)
{
   Parent = Parent.Parent
}

// Parent ist jetzt ein MailItem

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

20

06.07.2013, 17:57

Ok, danke für die Erklärung.

Also sollte dann MainItem so aussehen(?)

C#-Quelltext

1
2
3
4
5
6
7
  protected void b1_Click(object sender, RoutedEventArgs e)
        {NachrichtAuswaehlen();
while( Parent =! MailItem){
   Parent = Parent.Parent}
            if (this.ButtonClick != null)
                this.ButtonClick(Parent, e);  
        }


Sehe gerade VS lässt das gar nicht ausführen...


Naja, hab das Problem nun umgangen, indem jedes MailItem in Properties.Settings.Default.MailID immer seine Nummer abspeichert, wenn es angeklickt wird. Wenn das Click-Ereignis eintritt muss das MainWindow gar nicht gesagt bekommen, welches MailItem genau dieses Event ausgelöst hat, es kann es ja in der Properties.Settings.Default.MailID nachlesen...
Ist nicht optimal, aber funktioniert.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (06.07.2013, 18:19)


Werbeanzeige