2016-11-09 3 views
1

Ich fürchte, die Antwort ist wahrscheinlich nicht ... aber etwas Hintergrund. Um einen benutzerdefinierten Rahmen in einem Fenster zu zeichnen, in dem die Dimensionierungslogik über den sichtbaren Rahmen hinaus arbeitet (wie in Windows 10), habe ich überlagerte Fenster um die Kanten hinzugefügt, um die Nachrichten zu erfassen und sie dann an das zentrale Fenster weiterzuleiten. Dies funktionierte großartig, bis das Formular modal angezeigt wurde. An diesem Punkt wurden alle Randfenster automatisch deaktiviert. Offensichtlich ist das per Design ... aber ich bin mir nicht sicher, ob es einen Weg gibt. Ich habe versucht, die Randfenster des zentralen Fensters zu erstellen, aber das hat nicht funktioniert.Gibt es eine Möglichkeit, zusätzliche Fenster aktiv zu halten, wenn ein modales Fenster angezeigt wird?

Oder vielleicht gibt es einen besseren Ansatz vollständig.

Hier ist ein Beispiel für die Ausgabe:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     } 

     protected override void OnClick(EventArgs e) 
     { 
     base.OnClick(e); 

     Form f2 = new Form(); 

     f2.Text = "Non Modal"; 

     f2.Show(); 

     Form f3 = new Form(); 

     f3.Text = "Modal"; 

     f3.ShowDialog(this); 
     } 
    } 
+1

Ein modales Dialogfeld deaktiviert nur seinen Besitzer. Es ist nicht klar, welche Einrichtung Sie implementiert haben, so dass ein modales Dialogfeld diese zusätzlichen Fenster ebenfalls deaktiviert. – IInspectable

+0

Ein Beispiel hinzugefügt, um zu zeigen, dass das, was Sie gesagt haben, nicht der Fall zu sein scheint. – user109078

Antwort

0

Ich denke, Sie fälschen kann das modale Fenster, so dass es nicht aber modal die Anrufer deaktivieren. Ich habe das in einem eigenen Projekt verwendet. Ich habe es so gemacht:

//Setup small Interface 
public interface IDialog 
{ 
    //Our own Event which tell the caller if the Dialog is active/inactive 
    public event DialogChangedEventArgs DialogChanged; 
} 

//Setup EventArgs for our own Event 
public class DialogChangedEventArgs : EventArgs 
{ 
    public bool DialogActive{get;} 

    public DialogChangedEventArgs(bool dialogActive) 
    { 
     DialogActive = dialogActive; 
    } 
} 

//Setup the Form which act as Dialog in any other form 
public class Form2 : Form, IDialog 
{ 
    public event EventHandler<DialogChangedEventArgs> DialogChanged; 

    //If this Form is shown we fire the Event and tell subscriber we are active 
    private void Form2_Shown(object sender, EventArgs e) 
    { 
     DialogChanged?.Invoke(this, true); 
    } 

    //If the user close the Form we telling subscriber we go inactive 
    private void Form2_Closing(object sender, CancelEventArgs e) 
    { 
     DialogChanged?.Invoke(this, false); 
    } 
} 

public class Form1 : Form 
{ 
    //Setup our Form2 and show it (not modal here!!!) 
    private void Initialize() 
    { 
    Form2 newForm = new Form2(); 
    newForm.DialogChanged += DialogChanged; 
    newForm.Show(); 
    } 

    private void Form2_DialogChanged(object sender, DialogChangedEventArgs e) 
    { 
     //Now check if Form2 is active or inactive and enable/disable Form1 
     //So just Form1 will be disabled. 
     Enable = !e.DialogActive; 
    } 
} 

Es ist wirklich einfach. Verwenden Sie einfach ein Ereignis, um Ihr erstes Formular zu sagen: Hey iam second Form und aktiv. Dann können Sie das erste Formular deaktivieren, während die Sekunde aktiv ist. Sie haben die volle Kontrolle, welche Formulare aktiv sind oder nicht. Hoffe das hilft.

+0

Verwenden von EnableWindow könnte besser sein, dass alle Steuerelemente auf dem Hauptformular nicht auf das deaktivierte Aussehen ändern, aber ich denke, diese Technik wird gut funktionieren! – user109078

Verwandte Themen