2010-11-29 3 views
0

Dans ce cas, lorsque l'utilisateur clique sur un UIElement, je veux que cet élément soit entouré d'une bordure en pointillés. S'il y a un autre objet entouré, alors ce code le supprime d'abord. Tout va bien, mais "private void activateElem" se déclenche deux fois et je ne sais pas pourquoi. Peut-être que quelqu'un peut aider, je n'ai vraiment plus d'idées.wp7, silverlight, Pourquoi l'événement se déclenche deux fois?

Quelqu'un connaît quelques idées pour déboguer des problèmes comme celui-ci? Peut-être qu'il y a un moyen d'imprimer la file d'attente de tous les événements. Il est espion silverlight mais je pense que cela ne fonctionne pas pour Windows Phone 7.

Mon code:

public class ManipulationEngine 
{ 
    private Canvas sheet; 
    private static FrameworkElement current_active_element; 

    public ManipulationEngine(Canvas sheet) 
    { 
     this.sheet = sheet; 

     foreach (FrameworkElement elem in sheet.Children) 
     { 
      elem.MouseLeftButtonUp += new MouseButtonEventHandler(activateElem); 
     } 

    } 

    private void activateElem(object sender, MouseButtonEventArgs e) 
    { 
     FrameworkElement elem = sender as FrameworkElement; 

     if (current_active_element != null) 
     { 
      desactivateElem(); 
     } 

     Grid grid = new Grid(); 
     Rectangle recentagle = new Rectangle(); 

     grid.SetValue(Canvas.TopProperty, (double)elem.GetValue(Canvas.TopProperty) - 10); 
     grid.SetValue(Canvas.LeftProperty, (double)elem.GetValue(Canvas.LeftProperty) - 10); 

     DoubleCollection stroke = new DoubleCollection(); 
     stroke.Add(4); 
     stroke.Add(2); 
     recentagle.StrokeDashArray = stroke; 

     grid.Children.Add(recentagle); 
     sheet.Children.Remove(elem); 
     elem.Margin = new Thickness(10); 
     grid.Children.Add(elem); 
     sheet.Children.Add(grid); 

     current_active_element = elem; 
    } 



    private void desactivateElem() 
    { 
     if (current_active_element != null) 
     { 
      Grid grid = VisualTreeHelper.GetParent(current_active_element) as Grid; 

      grid.Children.Remove(current_active_element); 
      sheet.Children.Remove(grid); 

      current_active_element.SetValue(Canvas.TopProperty, (double)grid.GetValue(Canvas.TopProperty) + 10); 
      current_active_element.SetValue(Canvas.LeftProperty, (double)grid.GetValue(Canvas.LeftProperty) + 10); 
      current_active_element.Margin = new Thickness(0); 

      sheet.Children.Add(current_active_element); 

      current_active_element = null; 
     } 
    } 
+0

Je pense avoir trouvé la solution. Lorsque je clique sur FrameworkElement, l'événement se déclenche. Après cela, je supprime le FrameworkElement de Canvas et je l'ajoute dans la grille et que j'ajoute grille retour à Toile. Donc la solution est: "e.Handled = true;". Cela fonctionne maintenant :) Alors, l'objet FrameworkElement est plus profond dans l'arbre et de toute façon il se déclenche de nouveau. –

+0

Ajouter cela comme une réponse et l'accepter dans quelques jours. Il fournira la solution si quelqu'un d'autre rencontre le même problème. – ChrisF

Répondre

0

Je conseille vraiment regarder dans les pièces et le modèle États. Vous pouvez être en mesure de le faire avec un bouton, ou peut-être un bouton radio.

Habituellement, si vous modifiez les modifications de l'arborescence visuelle, vous ne le faites pas correctement. Karen Corby s'est occupée de cela très clairement au MIX08, jetez un coup d'oeil!

http://archive.visitmix.com/blogs/2008Sessions/T20/

Luc

Questions connexes