Bewegliches UserControl fängt an zu ruckeln

Jungbluth

Mitglied
Hallo,
ich habe für wpf ein eigenes User Control erstellt welches ich in einem Cavans frei bewegen will. Das funktioniert aber nur für wenige Pixel gut dann fängt an zu ruckeln bzw. hin und herzuspringen Woran könnte das liegen?
XML:
<UserControl x:Class="mdi.FloatPanel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:mdi"
             mc:Ignorable="d"
             d:DesignHeight="50" d:DesignWidth="500" Background="Gray" AllowDrop="True" MouseDown="FloatPanelMouseDown" MouseMove="FloatPanelMouseMove" MouseUp="FloatPanelMouseUp" Name="FloatPanel1" />

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace mdi
{
    /// <summary>
    /// Interaktionslogik für FloatPanel.xaml
    /// </summary>
    public partial class FloatPanel : UserControl
    {
        public FloatPanel()
        {
            InitializeComponent();
        }
        bool isDragging;
        Point Panel, mousePoint, newMousePoint;

        private void FloatPanelMouseDown(object sender, MouseEventArgs e)
        {
            isDragging = true;
            Panel = new Point(Canvas.GetLeft(this), Canvas.GetTop(this));
            mousePoint = new Point(Mouse.GetPosition(this).X, Mouse.GetPosition(this).Y);
        }

        private void FloatPanelMouseMove(object sender, MouseEventArgs e)
        {
            if (isDragging == true)
            {
                newMousePoint = new Point(Mouse.GetPosition(this).X,Mouse.GetPosition(this).Y);
                Canvas.SetLeft(this, (Panel.X + newMousePoint.X -mousePoint.X));
                Canvas.SetTop(this, (Panel.Y + newMousePoint.Y -mousePoint.Y));
            }
        }

        private void FloatPanelMouseUp(object sender, MouseEventArgs e)
        {
            isDragging = false;
        }
    }
}
 
Bin noch nicht so fit in WPF aber meine Vermutung wäre das du die Mousekoordinaten falsch abfragst.
Du fragst ja die Mouse koordinaten laut deinem Panel ab, dieser ist aber auch welcher den du verschieben willst.
Ich würde mit den Mauskorrdinaten laut Screen rechnen, die sind immer fix mit dennen kann man am besten ohne probleme rechnen.
 
Da das Control grundsätzlich in einem Canvas ist (Realisierung eines MDI-Containers in WPF) sollte das auch so funktionieren da ich es ja nicht über den ganzen Bildschirm verschieben will sondern nur innerhalb dieses Containers.
 
die screen koordinaten sind ja nur für die differenzberechnung gedacht.
entsprechende Kollisionsabfragen musst/müsste weiterhin selbst abprüfen.

Wie gesagt meine Vermutung, und war auch früher meist mein problem, das mit dem gleichen beweglichen objekt die mauskoordinaten abgefragt wurden, das gab immer unschöne effekte.
 
Ach was mir noch einfiel was noch sein könnte.

WPF ist so aufgebaut das z.B die Mausereignisse auch nur auf gezeichnete Objekte reagieren.

Ev. mal, falls nicht so ist, komplett hitnergrundfarbe über dein canvas setzen das mal wirklich alles gezeichnet ist, wenns dann reibungslos läuft hast du irgendwo nicht gezeichnete/gerendete stellen welche das ruckeln auch erklären könnten.
 
Zurück