Laden...

[erledigt] Phänomen beim Anzeigen von UserControls

Erstellt von pmSyS vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.098 Views
P
pmSyS Themenstarter:in
65 Beiträge seit 2006
vor 10 Jahren
[erledigt] Phänomen beim Anzeigen von UserControls

Moin moin,

ich hab seit längerem wieder ein Problem, auf das mir Google keinen Lösungsansatz liefert...:

Ich habe ein Programm, dass seine Funktionalität über Plugins anbietet und im Systray minimiert werden kann.
Die Plugins werden dynamisch beim Start geladen.
Die geladenen Plugins werden mit ihrem Namen in ein Menü eingebunden, damit sie auswählbar werden.
Das Plugin gibt seinen Inhalt über ein UserControl preis; es wird beim Klick im Menü in ein Panel - im Hauptfenster der gesamten Anwendung - eingesetzt.

So weit, so gut -> funktioniert auch.

Nun war die Anforderung, dass, wenn das Prog minimiert ist und jemand es nochmal über die .exe starten will, die aktuelle Instanz nach Vorne geholt werden soll.
Das habe ich hiermit gelöst: C# Single Instance App With the Ability To Restore From System Tray (Using Mutex)

Jetzt das Phänomen:

  1. Nach erstmaligem Start und nach ein paar Klicks im Menü (z.B. drei Plugins wurden nacheinander im Panel angezeigt) wird das Fenster minimiert.
  2. Der Versuch das Programm nochmal zu starten führt dazu, dass die aktuelle Instanz nach vorne und aus dem Systray geholt wird.
  3. Jetzt klicke ich auf Menüpunkte, die ich vor dem Minimieren nicht angezeigt habe -> Das Panel bleibt leer. Die, die ich zuvor angeklickt habe, werden weiterhin gezeigt, wenn sie ausgewählt werden.

Wenn ich das Prog.-Fenster über einen Doppelklick im Systray wieder vorhole, gibt es dieses Phänomen nicht.

Ich hab mal die Stelle debuggt, aber es ist weder irgendwie etwas null oder anders, als bei denen, die angezeigt werden:


public void changeContent(IPlugin plg)
        {
            pContent.Controls.Clear();
            UserControl uc = plg.MainUserControl;
            uc.Width = pContent.Width;
            uc.Height = pContent.Height;
            uc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
            uc.BackgroundImage = global::M_Web_Analyzer.GUI.Properties.Resources.MWeb_bg;
            pContent.Controls.Add(uc);
            //pContent.Refresh();
            core.ActivePlugin = plg;
            this.tiOptPlugin.Visible = true;
        }

Ich weiß grad nicht, warum die userControls nicht angezeigt werden, obwohl sie dem Panel hinzugefügt werden.

Ein "pContent.Refresh()" + Invalidate und Update habe ich schon versucht.

Ich hoffe, ihr könnt mir ein Paar Denkanstöße geben und dass ich mich bei der Problembeschreibung verständlich ausgedrückt habe.

Grüße

P
pmSyS Themenstarter:in
65 Beiträge seit 2006
vor 10 Jahren

Ich habe jetzt gemerkt, dass wenn dieses Phänomen auftritt und ich das Hauptfenster minimiere und es über einen Doppelklick im Systray wieder vorhole, dieses Phänomen weg ist... ?!

8o ?(

WTF

Gelöschter Account
vor 10 Jahren

Ich würde vermuten das dein Formular durch den API Call nicht mitbekommen hat das es sichtbar ist. Es hält sich weiter für unsichtbar, dadurch werden die neuen Controls darunter auch nicht dargestellt. Es erklärt auch das der Effekt verschwindet wenn du den Weg übers Tray Menü gehst.

P
pmSyS Themenstarter:in
65 Beiträge seit 2006
vor 10 Jahren

Ok, danke erstmal.

Kann man die Form vom Gegenteil überzeugen?
Also, wie kann man da gegensteuern?

Das ist so sehr unschön...

Grüße
pmSyS

Gelöschter Account
vor 10 Jahren

Du müsstest davon wegkommen deine Anwendung fremdgesteuert einblenden zu wollen. Dazu müsstest du einen quasi Kanal einrichten der deine bestehende Instanz benachrichtigt damit diese sich selbst einblenden kann über die bestehenden Mechanismen (this.Visible=true oder this.Show() whatever...)

Dazu hast du verschiedene Möglichkeiten.
Wenn ich das richtig sehe lauscht deine erste Instanz auf eine Windows Message

protected override void WndProc(ref Message message)
{
	if (message.Msg == SingleInstance.WM_SHOWFIRSTINSTANCE) {
		ShowWindow();
	}
	base.WndProc(ref message);
} 

Tausche den Code in ShowWindow einfach auf this.Show() oder this.Visible=true
Alternativ stehen dir noch die ROT ,NamedPipes, natives IPC(Shared Memory) oder AppDomains zur Verfügung um Daten zwischen Anwendungen bzw. Anwendungsinstanzen zu teilen und zu signalisieren.

F
10.010 Beiträge seit 2004
vor 10 Jahren

Oder den schon seit 10 Jahren im Framework für Windowsforms vorhandenen Mechanismus im aus WindowsFormsApplicationBase benutzen.

P
pmSyS Themenstarter:in
65 Beiträge seit 2006
vor 10 Jahren

"this.Visible=true" an der von dir genannten Stelle hat's gebracht...

Danke!

Grüße