2010-08-03 8 views
1

Eh bien, j'utilise une fenêtre comme boîte de message personnalisé avec quelques contrôles qui sont affichés/remplis de texte selon le constructeur appelé.Conseil boîte de message personnalisé

J'ai un événement défini, auquel je suis abonné via la classe d'origine, cela se déclenche une fois que le bouton a été cliqué.

Cependant, je ne vois pas comment l'utiliser efficacement, de préférence je voudrais retourner un bool si oui ou non a été cliqué, mais évidemment mon code continuera à s'exécuter, d'où la méthode qui est sous-cablé au bouton Cliquez sur. Voici un exemple de code pour clarifier le problème.

message Jardinière

public partial class CustomMessageBox : Window 
    { 

     public delegate void MessageBoxHandler(object sender, EventArgs e); 
     public event MessageBoxHandler MessageBoxEvent; 

     public CustomMessageBox() 
     { 
      InitializeComponent(); 
     } 

     public CustomMessageBox(string message) 
     { 
      InitializeComponent(); 
      this.txtdescription.Text = message; 
     } 

     public CustomMessageBox(string message, string title, string firstBtnText) 
     { 
      InitializeComponent(); 
      this.lbltitle.Content = title; 
      this.txtdescription.Text = message; 
      this.btnstart.Content = firstBtnText; 
     } 

    } 

    public static class MessageBoxButtonClick 
    { 

     public static bool Yes { get; set; } 
     public static bool No { get; set; } 
     public static bool Cancel { get; set; } 
    } 

fenêtre qui Instancie la fenêtre MessageBox

private void StartProcess_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 

      foreach (var result in results) 
      { 
       if(result.ToBeProcessed) 
        _validResults.Add(new ToBeProcessed(result.Uri, result.Links)); 

      } 
      _msgbox = new CustomMessageBox("Each Uri's backlinks will now be collected from Yahoo and filtered, finally each link will be visited and parsed. The operation is undertaken in this manner to avoid temporary IP Blocks from Yahoo's servers.", "Just a FYI", "OK"); 
      _msgbox.MessageBoxEvent += (MessageBoxHandler); 

      if (_msgBoxProceed) 
      { 
       _msgbox.Close(); 
       Yahoo yahoo = new Yahoo(); 

       yahoo.Status.Sending += (StatusChange); 

       //What I'd like to happen here is the code simply stop, like it does when calling a messagebox is winforms 
       //e.g. 
       // if(ProceedClicked == true) 
       // do stuff 

       // yahoo.ScrapeYahoo(_validResults[Cycle].Uri, _validResults[Cycle].LinkNumber); 

       //Cycle++; 
      } 
      else 
      { 
       _msgbox.Close(); 
      } 

     } 

private void MessageBoxHandler(object sender, EventArgs e) 
     { 
      if (MessageBoxButtonClick.Yes) 
      { 
       ProceedClicked = true; 
      } 
      else 
      { 
       ProceedClicked = false; 
      } 
     } 

Espérons qui le rend assez clair, je ne peux pas tout le code d'exécution à-dire appeler un certain méthode en raison de l'utiliser plusieurs fois tout au long de mon application.

Répondre

1

Très difficile de comprendre exactement le problème. De plus, le code que vous avez écrit ici ne semble pas avoir d'appels, ce qui afficherait le CustomMessageBoxWindow. Tout d'abord, ai-je raison de deviner que dans votre fenêtre principale, vous voulez que votre code attende if (_msgBoxProceed) jusqu'à ce que l'utilisateur appuie sur un bouton dans votre CustomMessageBoxWindow (actuellement il montre juste la boîte de message et continue d'exécuter les instructions suivantes)?

Si oui, je devine que vous affichez votre fenêtre de boîte de message avec la méthode Show(). Utilisez ShowDialog() à la place. Cela entraînera l'arrêt de l'exécution du code, jusqu'à ce que la boîte de message se ferme.

Si vous ne souhaitez pas utiliser une boîte de dialogue modale, deux options sont disponibles. Utilisez les objets de synchronisation de threads (par exemple AutoResetEvent) ou configurez un nouvel événement pour la fermeture du message et poursuivez l'exécution du code dans le gestionnaire d'événements closed (dans StartProcess_Click, la dernière ligne serait un appel à _msgBox.Show() et tout if (_msgBoxProceed) se trouverait dans le gestionnaire d'événement fermé).

+0

Hey Mark, je n'ai pas réalisé que Windows dans WPF avait la propriété ShowDialog, donc mon problème est résolu. Merci compagnon. – Ash