2012-04-12 22 views
0

ich diesen Code verwenden .. jetzt standardmäßig meine app ist TopMost = trueÄnderung TopMost zur Laufzeit

Aber wenn ich versuche, eine Taste, um diese Funktion zu machen, führen Sie unter mir ein Problem bekommen, wird es deaktivieren einmal. Dann beim zweiten Klick nicht nochmal.

public void setTop() 
{ 
    if (this.TopMost == false) 
    { 
     this.TopMost = true; 
    } 
    if (this.TopMost == true) 
    { 
     this.TopMost = false; 
    } 

Irgendwelche Ideen warum? Dies ist auch in der Vergangenheit mit Einstellungen Hotkey aus einem Menü geschehen, ich war in der Lage, es einmal zu tun, danach es funktioniert nicht :(

Edit: Ich habe herausgefunden, wie es geht, aber nicht von einem anderen tun können bilden diese mit.

private void button1_Click(object sender, EventArgs e) 
{ 
    pwn4g3 mainForm = new pwn4g3(); 
    mainForm.TopMost = true(); 
    mainForm.Update(); 
} 
+1

-Code Tipp: * Nie * schreiben 'if (x == true)', und Sie sollten wahrscheinlich 'schreiben, wenn' statt 'if (x == false)' zu (x!). In diesem Fall reicht 'this.TopMost =! This.TopMost;' für die gesamte Methode aus. – Ryan

+3

Sie könnten auch einfach TopMost =! TopMost schreiben. –

+0

Ähm, warte, wie klickst du es das zweite Mal, wenn es deaktiviert wurde? Das Ändern von TopMost hat viele mögliche Nebenwirkungen, das native Windows-Fenster wird neu erstellt. Sie müssen Ihre Beweise verbessern, damit wir Ihnen helfen können. Ein kleines Repro-Projekt mit diesem Problem ist am besten, es an einen Dateifreigabedienst zu senden, wenn es noch zu groß ist, um es zu posten. –

Antwort

1
public void setTop() 
{ 
    if (this.TopMost == false) 
    { 
     this.TopMost = true; 
    } 
    else // change this to else. 
    { 
     this.TopMost = false; 
    } 
} 

In Ihrer Version als wahr zugeordnet ist this.topmost, die zweite if Bedingung erfüllt. Dass die Ursache des Problems ist.

Ermöglicht die Ausführung von Code sagen beginnt mit falsch, dann zuerst wenn Bedingung i s ist zufrieden, ändert sich zu true, prüft die zweite if-Bedingung, es ist auch erfüllt, wechselt wieder zu false.

+1

Oder du könntest das einfach tun.TopMost =! This.TopMost -> Wenn es falsch ist, wird es wahr sein. Wenn es wahr ist, wird es falsch werden – thorkia

+0

Das würde funktionieren, korrigieren .. aber jetzt ändert sich das Problem von einem anderen Formular. –

+0

@thorkia Das ist ein großartiger Vorschlag. Ich mochte es. Aber ich bin mir nicht sicher über die Lesbarkeit. – Sandeep

0

Sie sind nicht Showing Ihre Form in Ihrem zweiten Beispiel versuchen:

private void button1_Click(object sender, EventArgs e) 
{ 
    pwn4g3 mainForm = new pwn4g3(); 
    mainForm.Show(); 
    mainForm.TopMost = true; 
    mainForm.Update(); 
} 

Auch wenn Sie mainForm.Show(this); das zweite Formular verwendet wird automatisch von Ihrem Parent Form und wird auf der Oberseite gehören.

private void button1_Click(object sender, EventArgs e) 
{ 
    pwn4g3 mainForm = new pwn4g3(); 
    mainForm.Show(this); 
} 

Aber persönlich, wenn ich die Topmost Eigenschaft wechseln fehlte würde ich meine Form Variable als Klassenstufe Variable haben und so etwas tun.

public partial class Form1 : Form 
{ 
    pwn4g3 mainForm = new pwn4g3(); 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if(mainForm.IsDisposed) //Check that Form hasn't been destroyed 
      mainForm = new pwn4g3(); 
     if(!mainForm.Visible) //Make sure it is visible 
      mainForm.Show(); 

     mainForm.TopMost = !mainForm.TopMost; 
     this.BringToFront(); //To verify zorder of created form 
    } 
} 
+0

Hmm. das würde funktionieren, ja .. aber das Problem ist, dass ich einen Splash-Screen benutze, damit es beim Speichern immer wieder den Splash anzeigt. –

+0

@Jogn Was versuchst du zu tun? Was ist der Zweck dieser Form? –