2015-02-26 3 views
0

Y at-il un moyen d'être averti lorsqu'un InlineUIContainer est supprimé dans un RichTextBox? Actuellement, j'utilise l'événement Unload, ce qui pose un problème car l'événement est également appelé lorsque je passe d'un onglet à l'autre.Evénement de suppression InlineUIContainer dans RichTextBox

Mon code:

Création du InlineUIContainer:

InlineUIContainer container = new InlineUIContainer(presenter) { BaselineAlignment = BaselineAlignment.TextBottom }; 
container.Tag = new TagTextBoxObject(Id, InputText); 
container.Unloaded += presenter_Unloaded; 

L'événement, qui ne devrait pas se faire virer sur les onglets de commutation:

void presenter_Unloaded(object sender, RoutedEventArgs e) 
{ 
    Dispatcher.Invoke(
     (Action)delegate() 
     { 
      TagTextBoxObject item = (TagTextBoxObject)(sender as InlineUIContainer).Tag; 

      if (newItems.ContainsKey(item.Id)) 
      { 
       newItems.Remove(item.Id); 
      } 

      if (!deletedItems.ContainsKey(item.Id)) 
      { 
       deletedItems.Add(item.Id, item.Text); 
      } 
     }); 
} 
+0

L'événement est appelé parce que la page précédemment sélectionnée a été déchargé. Quel est le but à être remarqué quand un InlineUIContainer est supprimé? –

+0

J'ai développé une balise Tag, et si je supprime une balise par retour arrière, je supprime également la balise de la base de données. Mais maintenant les données ont été supprimées sans retour arrière :) – BendEg

+0

Vous devez mettre votre solution dans la boîte de réponse et l'accepter, et ne pas l'éditer dans la question, sinon la question reste dans la file d'attente "non résolue". –

Répondre

0

La solution, regardez wether le parent est chargé:

void presenter_Unloaded(object sender, RoutedEventArgs e) 
    { 
     if (this.Parent != null && this.Parent is FrameworkElement) 
     { 
      if ((this.VisualParent as FrameworkElement).IsLoaded) 
      { 
       Dispatcher.Invoke(
        (Action)delegate() 
        { 
         TagTextBoxObject item = (TagTextBoxObject)(sender as InlineUIContainer).Tag; 

         if (newItems.ContainsKey(item.Id)) 
         { 
          newItems.Remove(item.Id); 
         } 

         if (!deletedItems.ContainsKey(item.Id)) 
         { 
          deletedItems.Add(item.Id, item.Text); 
         } 
        }); 
      } 
     } 
    } 
1

Vous pouvez résilier votre abonnement de l'événement Unload lorsque le TabControl.SelectionChanged est tiré. Et abonnez-vous à nouveau lorsque l'onglet spécifique est sélectionné.

Mais je pense que le meilleur moyen est de créer un contrôle personnalisé qui hébergera un TextBox et un ItemsControl et n'utilise pas RichTextBox.

+0

Merci pour votre réponse, mais j'ai trouvé une solution plus pratique, regardez mon ** EDIT 2 **. Mais vous m'avez donné l'indice :) – BendEg

+0

Réponse est fait :) – BendEg