none
InkCanvas.Children.Add(UIElement) verursacht Endlosschleife in MouseMoveEvent RRS feed

  • Frage

  • Hi Leute,
    ich habe seit geraumer Zeit ein Problem.
    Ich bin gerade dabei eine GUI mit Zeichnungsfunktionalitäten zu basteln.
    Meine GUI besteht aus einem Hauptfenster in dem alle Elemente enthalten sind die das Fenster so braucht.
    Also ein Menu nen Expander mit Buttons usw.
    Mein Zeichenkontainer ist ein INKCanvas. In meinem InkCanvas lade ich dann nen Bild von einem 2D-Gruindriss der dann per Maus abgemalt werden soll.
    Um den Zeichnenmodus zu starten drücke ich auf einen Button im Fenster, der ein Command absetzt das sich Draw nennt.
    <Button Name="DrawingButton" ToolTip="Zeichnen" Command="{x:Static local:GUICommands.Draw}"/>
    


    Das Command ruft eine static Variable einer Klasse auf die ein RoutedUICommand absetzt welches auf zwei HandlerMethoden verweist.
    public class GUICommands
        {
            private static readonly RoutedUICommand _draw;
     
           static GUICommands()
            { 
    _draw=newRoutedUICommand("vektorisieren","draw",typeof(GUICommands));
    } public static RoutedUICommand Draw { get{ return _draw; } } } }
     
    Die Handler-Methoden heißen CanExecuteDraw und DrawNewExecuted und sind in meinem Fenster an die CommandBindings Eigenschaft  des Fensters gebunden.
    <Window.CommandBindings>
            <CommandBindingCommand="local:GUICommands.Draw" CanExecute="CanExecuteDraw"Executed="DrawNewExecuted">
            </CommandBinding>
    </Window.CommandBindings>
     
    Nachdem ich also den Draw-Button gedrückt habe wird zuerst CanExecuteDraw ausgeführt.
    private void CanExecuteDraw(objectsender,CanExecuteRoutedEventArgs e)
            {
                e.CanExecute = true;
                e.Handled = true;
     }

    hier fange ich noch nichts ab ....
    Dadurch das die CanExecute-Eigenschaft auf true gesetzt ist wird nun die DrawExecuted-Methode aufgerufen.
    private void DrawNewExecuted(object sender, ExecutedRoutedEventArgs e)
            {
                MainCanvas.Cursor = System.Windows.Input.Cursors.Pen;
                MainCanvas.MouseMove += new MouseEventHandler(MainCanvas_MouseMove);
                MainCanvas.MouseLeftButtonDown += new MouseButtonEventHandler(MainCanvas_MouseDown);
                e.Handled = true;
    }

    DrawExecuted setzt den Curso des InkCanvas auf Pen, hängt einen MouseMove Event und ein MouseLeftButtonDownEevnt an das InkCanvas-Obj (MainCanvas)


    Wenn ich jetzt mit der Maus über den InkCanvas fahre wird das MouseMove Event ausgelöst und die Handler Methode MainCanvas_MouseMove aufgerufen
    private void MainCanvas_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
            {
                Console.WriteLine("MouseMove" + i);
                GuiPoint tempPoint = new GuiPoint(e.GetPosition(MainCanvas));
                DrawPoint(tempPoint);
                DeleteNextToLast();
                i++;
    }

    Hier erzeuge ich eine GuiPoint-Objekt weilches die Mauskoordinaten an dessen Konstruktor übergibt. Des Weiteren hat der GuiPoint ein Aussehen was in seiner .XAML-Datei definiert wird.
    Nachdem ich den Punkt erzeugt habe rufe ich DRAWPOINT auf
    private void DrawPoint(GuiPoint Point)
     { InkCanvas.SetLeft(Point, Point.X - 2.5);
     InkCanvas.SetTop(Point, Point.Y - 2.5);
     Canvas.SetZIndex(Point, 1);
     MainCanvas.Children.Add(Point); }

    DRAWPOINT setzt die X/Y-Position (-2.5 da der Punkt eine Ellipse ist die 5 Pixel im Durchmesser misst) des GuiPoint-Objektes im InkCanvas und den Z-Achsenwert des GuiPoint-Objektes auf 1

    Bis hierhin gibt es keine Probleme. MouseMove wird nur aufgerufen wenn ich auch wirklich die Maus bewege. Sobald ich aber das UIElemnt (GuiPoint) als Child zu der Child-Liste des InkCanvas hinzufüge, wird das MouseMoveEvent ausgeführt ohne das ich die Maus bewege....

    (an dieser Stelle lasse ich mir ausgeben wie oft der Handler aufgerufen wird)
     private void MainCanvas_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
            {
                Console.WriteLine("MouseMove" + i);
                ......
            }
     
    was mache ich falsch???????
    ich habe keinen blassen......


    Donnerstag, 14. Januar 2010 13:56