2010-11-29 14 views
0

In diesem Fall, wenn der Benutzer auf ein UIElement klickt, möchte ich, dass dieses Element von einer gestrichelten Umrandung umgeben ist. Wenn ein anderes Objekt umgeben ist, entfernt dieser Code es zuerst.wp7, silverlight, Warum wird das Ereignis zweimal ausgelöst?

Alles ist gut, aber "private void activateElem" feuert zweimal und ich habe keine Ahnung warum. Vielleicht kann jemand helfen, ich habe wirklich keine Ideen mehr.

Kennt jemand einige Ideen, um solche Probleme zu debuggen? Vielleicht gibt es eine Möglichkeit, alle Ereigniswarteschlangen auszudrucken. Es ist Silverlight-Spion, aber ich denke, es ist nicht für Windows Phone 7.

Mein Code funktioniert:

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

Ich denke, dass ich die Lösung gefunden zu haben. Wenn ich auf FrameworkElement klicke, wird das Ereignis ausgelöst. Danach entferne ich das FrameworkElement aus Canvas und ich füge es in das Raster ein und dann füge ich das Raster wieder zu Canvas hinzu. Also lautet die Lösung: "e.Handled = true;". Es funktioniert jetzt :) Also danach ist das FrameworkElement tiefer im Baum und irgendwie feuert es wieder. –

+0

Fügen Sie das als Antwort hinzu und akzeptieren Sie es in ein paar Tagen. Es wird die Lösung bereitstellen, sollte jemand anderes das gleiche Problem erfahren. – ChrisF

Antwort

0

ich wirklich in die Teile und Staaten Modell suchen raten würde. Sie können dies möglicherweise mit einer Schaltfläche oder einem Optionsfeld tun.

Normalerweise, wenn Sie Änderungen an der visuellen Struktur codieren, tun Sie es nicht richtig.

Karen Corby hat das sehr deutlich bei MIX08 gemacht, schaut mal rein!

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

Luke

Verwandte Themen