2009-05-20 8 views
14

Ich habe eine .NET 3.5 MDI WinForms-Anwendung.Problem mit Symbol beim Erstellen eines neuen maximierten MDI-untergeordneten Formulars in .NET

Ich legte die Eigenschaft Icon eines untergeordneten Formulars fest, und das Symbol wird in der oberen linken Ecke des Formulars korrekt angezeigt. Ich maximiere dann das untergeordnete Formular und das Symbol ist immer noch in Ordnung.

Mit dem Kind Formular noch maximiert, öffne ich ein anderes Kind-Fenster, das automatisch maximiert. Das Symbol dieses Formulars ist nicht das Symbol in der Icon-Eigenschaft, sondern das Standard-.NET-Symbol (das mit den blauen, roten und gelben Quadraten). Wenn ich jedoch die Größe des übergeordneten MDI-Formulars ändere, wird das Symbol zurückgesetzt und ordnungsgemäß angezeigt.

Hat jemand einen Workaround oder weiß, warum das passiert?

+0

Haben Sie versucht, eine .Refresh auf das Kind Fenster zu tun, nachdem sie öffnen? –

Antwort

8

Recht, das ich gefunden habe eine Lösung ...

Die Abhilfe für dieses ist das Symbol wieder auf dem Load-Ereignis des Kindes Form wie folgt festzulegen:

private void StatsForm_Load(object sender, EventArgs e) 
{ 
    //bug that means you have to set the desired icon again otherwise it reverts to default when child form is maximised 
    Icon = new System.Drawing.Icon("research.ico"); 
} 

dies, dass Sie bedeutet Zuerst muss die betreffende Symboldatei in Ihr VS-Projekt/Ihre VS-Lösung eingefügt und auf "Immer kopieren" gesetzt werden, damit sie kopiert wird, wenn Ihre Lösung erstellt wird.

HTH Calanus

+2

Funktioniert wie ein Charme. Vielen Dank. Aus irgendeinem Grund habe ich nie daran gedacht, das Icon zurückzusetzen. Es funktioniert auch als eine eingebettete Ressource, also haben Sie nicht eine Menge (ersetzbare) Dateien im endgültigen Verzeichnis. –

4

fand ich, dass die einzige Lösung, die MDI-Kind zu deaktivieren und dann wieder aktivieren war:

document.Show(); 
// Work-around for error in WinForms that causes MDI children to be loaded with the default .NET icon when opened maximised. 
ActivateMdiChild(null); 
ActivateMdiChild(document); 

Dies ist die Lösung in this reply on MSDN forums und es funktionierte für mich gegeben.

+0

Es funktioniert, aber verursacht ein Problem, wenn Sie ShowDialog überall verwenden. – Drake

+0

Was für ein Problem? –

+0

Wenn Sie in Ihrem Code ShowDialog statt Show verwenden, blockiert die Ausführung diesen Aufruf. Erst wenn der Dialog geschlossen ist, laufen die Aufrufe von ActivateMdiChild, aber die zweite Funktion wird nicht funktionieren, da 'document' zu diesem Zeitpunkt nicht mehr existiert – alldayremix

0

Meine Lösung: Lassen Sie die Eigenschaft "ShowIcon" von MdiChild auf true, weisen Sie ein transparentes 1x1-Symbol zu. Problem gelöst.

+1

Vielleicht vermisse ich etwas, aber ich bin mir nicht sicher, wie das auf meine Anwendung zutrifft ursprüngliche Frage. Das Problem ist nicht, dass ein Symbol angezeigt wird, wenn ich nicht will, sondern dass das * Symbol, das ich zeigen möchte, nicht angezeigt wird und stattdessen durch den Standard ersetzt wird. –

0

Die beste Problemumgehung, die ich gefunden habe, um dieses Problem zu beheben, ist here.

aNewForm.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog 
AddHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged 

aNewForm.Show() 
aNewForm.WindowState = FormWindowState.Maximized 

RemoveHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged 

der Handler

Protected Sub Form_SizeChanged(ByVal sender As Object, ByVal e As EventArgs) 

    If WindowState = FormWindowState.Maximized Then 
     If FormBorderStyle <> FormBorderStyle.Sizable Then FormBorderStyle = FormBorderStyle.Sizable 
    End If 

End Sub 
1
form.WindowState = FormWindowState.Normal 
form.Show() 
form.WindowState = FormWindowState.Maximized 
form.Show() 

Mein Problem wurde gelöst!

3
private void frmChild_Shown(object sender, EventArgs e) 
{ 
    // Work-around for maximized BUG 
    this.Icon = this.MdiParent.Icon; 
    this.WindowState = FormWindowState.Normal; 
    this.WindowState = FormWindowState.Maximized; 
} 
11

Eine leichte Modifikation zu Calanus' Lösung:

private void MdiBase_Load(object sender, EventArgs e) 
    { 
     // Fixes bug where loading form maximised in MDI window shows incorrect icon. 
     this.Icon = Icon.Clone() as Icon; 
    } 

Dieses Sie auf das Symbol zur Entwurfszeit festlegen können (so wie man es für andere Formen) und benötigt keine hartcodiert Datei- oder Ressourcenzugriff.

2

Ich fand heraus, dass dies das Problem auch beheben wird.

myForm.WindowState = FormWindowState.Normal; 
myForm.Show(); 
myForm.WindowState = FormWindowState.Maximized; 
0

Addiert man diese als die erste Zeile in der Form_Load-Methode auf dem MDI Kinder funktioniert für mich:

this.Icon = new Icon(this.Icon, this.Icon.Size); 
Verwandte Themen