Pourquoi une boîte de message C #/.NET n'est-elle pas modale?
Par accident, si la boîte de message se trouve derrière notre interface utilisateur principale, celle-ci ne répond pas tant que nous n'avons pas cliqué sur OK (dans notre boîte de message).
Existe-t-il une solution de contournement autre que la création d'une boîte de message personnalisée?
Vous devez affecter la propriété propriétaire de MessageBox à la fenêtre principale de l'interface utilisateur (regardez le troisième constructeur).
Voici une nouvelle application Windows Forms C # simple:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string message = "You did not enter a server name. Cancel this operation?";
string caption = "No Server Name Specified";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;
// Displays the MessageBox.
result = MessageBox.Show(this, message, caption, buttons);
if (result == DialogResult.Yes)
{
// Closes the parent form.
this.Close();
}
}
}
}
Comme Dusty indique dans sa réponse , une boîte de message est un dialogue modal. Spécifiez la propriété 'propriétaire'. Dans cet exemple, le propriétaire est désigné par le mot clé 'this'.
Pour obtenir une boîte de message modale système, définissez MessageBoxOptions.DefaultDesktopOnly .
Techniquement, une fenêtre contextuelle modale est définie comme une boîte contextuelle qui interrompt le flux normal de l'application ... pas nécessairement une fenêtre qui reste au-dessus de toutes les autres fenêtres. .
Voici un projet sur CodeProject qui tente d'imiter la fonctionnalité "Toujours visible" pour une fenêtre modale de style MessageBox:
Vous pouvez utiliser le paramètre owner pour spécifier un objet particulier, qui implémente l'interface IWin32Window , pour placer la boîte de message devant.
Une boîte de message est une boîte de dialogue modale, ce qui signifie qu'aucune entrée (clic du clavier ou de la souris) ne peut se produire, sauf pour les objets du formulaire modal. Le programme doit masquer ou fermer un formulaire modal (généralement en réponse à une action de l'utilisateur) avant que la saisie dans un autre formulaire puisse avoir lieu.
Ce que je fais habituellement si je dois déclencher un MessageBox à partir d'un autre thread (pas du thread principal) est le suivant:
Je crée une variable statique avec l'instance de formulaire:
statique privée Form1 myform;
À partir du thread, j'appelle l'opération pour afficher le MessageBox à partir du thread principal:
myform.BeginInvoke ((MethodInvoker) delegate () {MessageBox.Show ("Processus terminé!", "Informations sur le processus de thread", MessageBoxButtons.OK, MessageBoxIcon.Information);});
Ceci est juste un "emporte-pièce" que j'utilise toujours, et fonctionne parfaitement pour moi.
Faites en sorte que la boîte de message apparaisse dans le fil principal, si votre formulaire a été créé à partir de celui-ci:
private bool ShowMessageBoxYesNo()
{
if (this.InvokeRequired)
return (bool)this.Invoke(new ShowMessageBoxYesNoDelegate(ShowMessageBoxYesNo));
else
{
DialogResult res = MessageBox.Show("What ?", "Title", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (res == DialogResult.Yes)
return true;
else
return false;
}
}
Cela fonctionne pour moi:
MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);
Form.ActiveForm vous donnerait le formulaire actif, même si vous élevez votre MessageBox à partir d'une autre classe.