Sur la base de la réponse Josh G
réponse de Josh est excellent si vous voulez déplacer une grille, mais ne dispose pas des capacités pour le mouvement de plusieurs éléments.
Voici comment déplacer plusieurs éléments séparément
XAML
<Grid x:Name="gridHost">
<Grid x:Name="gridBlue" Background="Blue" Width="100" Height="100" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" Margin="-100,0,0,0">
<Grid.RenderTransform>
<TranslateTransform/>
</Grid.RenderTransform>
</Grid>
<Grid x:Name="gridRed" Background="Red" Width="100" Height="100" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" Margin="100,0,0,0">
<Grid.RenderTransform>
<TranslateTransform/>
</Grid.RenderTransform>
</Grid>
</Grid>
code derrière
Point m_start;
Vector m_startOffset;
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = sender as Grid;
TranslateTransform translate = element.RenderTransform as TranslateTransform;
m_start = e.GetPosition(gridHost);
m_startOffset = new Vector(translate.X, translate.Y);
element.CaptureMouse();
}
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
FrameworkElement element = sender as Grid;
TranslateTransform translate = element.RenderTransform as TranslateTransform;
if (element.IsMouseCaptured)
{
Vector offset = Point.Subtract(e.GetPosition(gridHost), m_start);
translate.X = m_startOffset.X + offset.X;
translate.Y = m_startOffset.Y + offset.Y;
}
}
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = sender as Grid;
element.ReleaseMouseCapture();
}
Nice, mais cette approche n'est pas très efficace. Lorsque vous faites glisser une grille contenant environ 10 contrôles de modèles personnalisés, la charge de mon processeur va jusqu'à 23%! (Core i7 3770) N'y a-t-il pas une meilleure façon de faire cela? J'ai également changé le conteneur parent en canvas et utilisé 'Canvas.SetLeft', mais pas de changement de performance. – SepehrM
Les transformations de rendu coûtent cher, en particulier lorsque vous réalisez un rendu très complexe d'un contrôle complexe. Il n'y a pas de moyen simple de contourner cela. Quelques suggestions: Créez une copie simplifiée du contrôle (ou même enregistrez un instantané de l'image) et utilisez cette copie pour la transformation de rendu glisser/déposer. OU: Ne pas mettre à jour la transformation de rendu chaque fois que la souris se déplace. Mettez à jour chaque Nième coup, ou seulement lorsque le décalage est supérieur à un certain seuil, ou seulement après des intervalles temporisés, etc. –
Oui, je pense que je vais juste vérifier le niveau de rendu graphique de l'utilisateur et déplacer juste un instantané du contrôle lorsque le système n'est pas de niveau 2. – SepehrM