Laden...

[gelöst] Problem beim verschieben von UserControls auf einem Canvas

Erstellt von nordside vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.933 Views
nordside Themenstarter:in
186 Beiträge seit 2007
vor 16 Jahren
[gelöst] Problem beim verschieben von UserControls auf einem Canvas

Hallo,

ich habe ein Canvas und darauf mehrere UserControls. Um die UserControls zu verschieben nutze ich die MouseEvents
*PreviewMouseLeftButtonDown *PreviewMouseMove *PreviewMouseLeftButtonUp

des UserControls.

Die Verschiebung erfolgt dadurch, dass ich die Eigenschaft "Margin" des UserControls anpasse. Das funktioniert auch, solange die Verschiebung per Maus langsam erfolgt. Bei ruckartigen Bewegungen verlässt die Maus aber den Bereich des UserControls - die Verschiebung wird abgebrochen. Was mache ich falsch?

nordside

nordside Themenstarter:in
186 Beiträge seit 2007
vor 16 Jahren

Ich habe glaube ich das Problem identifiziert:


private void myCanvasUC_PreviewMouseMove(object sender, MouseEventArgs e)
{
  try
  {
    myUC dragElement = (myUC)e.Source;
    Point currentPoint = e.GetPosition(myCanvasUC);
    dragElement.Arrange(
       new Rect(
         currentPoint.X - startPoint.X,
         currentPoint.Y - startPoint.Y,
                 dragElement.ActualWidth,
                 dragElement.ActualHeight));
   }
   catch(InvalidCastException)
   {
     count++;
   }
}

Wenn ich beim Event PreviewMouseLeftButtonUp mir den Wert von count anzeige, kommt da ein Wert größer 0 raus. Das bedeutet, während der Mausbewegung nimmt WPF ein falsches Element - oder?

Kann mir jemand erklären was da schief läuft? Danke!
nordside

6.862 Beiträge seit 2003
vor 16 Jahren

Falls dir ne fertige Variante gefallen könnte wäre das hier interessant.

Problem bei dir ist, das dein Source ja alles mögliche sein kann. Ich zitier einfach mal aus den obrigen Artikel:

Since the object passed to this method might be deeply embedded inside of a child of the DragCanvas, it is necessary to walk up the ancestor chain of the argument value. For example, the element which was clicked on by the user could be a Run inside of a Hyperlink, which is in a TextBlock, which is in a StackPanel, which is contained within a UniformGrid (which is a child of the DragCanvas). In that situation, we need to walk from the Run object up to the UniformGrid because only direct descendants of a DragCanvas can be dragged.

Baka wa shinanakya naoranai.

Mein XING Profil.

2.760 Beiträge seit 2006
vor 16 Jahren

Du musst nicht unbedingt Margin benutzen. Es gibt auch Location oder Position oder so (ist ein DependencyProperty vom Canvas).

Langsam bewegen/schnell bewegen kannst du evtl. mit CaptureMouse oder ähnlich beheben.

nordside Themenstarter:in
186 Beiträge seit 2007
vor 16 Jahren

Hallo,

vielen Dank für eure Hinweise - das hilft mir wirklich weiter!!!

Danke
nordside