2009-04-17 6 views
2

HI,Comment faire pour déplacer un panneau de grille dans la fenêtre WPF

Comment déplacer un panneau de grille dans une fenêtre WPF? Le panneau de grille n'a pas de position ou d'emplacement ou de coordonnées X et Y. Tout ce que je regarde est de déplacer le panneau de la grille de son emplacement actuel à un nouvel emplacement en utilisant la souris afin que les contrôles qui sont "enterrés" en dessous apparaîtront.

Des pointeurs?

Merci beaucoup.

Répondre

12

Voici quelques exemples de code pour vous aider à démarrer:

En XAML:

Créer une grille et définir une transformation de rendu sur elle:

<Grid x:Name="grid" Background="Blue" 
     Width="100" Height="100" 
     MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp"> 
    <Grid.RenderTransform> 
     <TranslateTransform x:Name="tt"/> 
    </Grid.RenderTransform> 
</Grid> 

Nom du contrôle que vous voulez la grille de se déplacer dans:

<Window x:Name="window" ...> 
    <Grid x:Name="grid"... 
</Window> 

Dans le code derrière:

Point m_start; 
Vector m_startOffset; 

private void Grid_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    m_start = e.GetPosition(window); 
    m_startOffset = new Vector(tt.X, tt.Y); 
    grid.CaptureMouse(); 
} 

private void Grid_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (grid.IsMouseCaptured) 
    { 
     Vector offset = Point.Subtract(e.GetPosition(window), m_start); 

     tt.X = m_startOffset.X + offset.X; 
     tt.Y = m_startOffset.Y + offset.Y; 
    } 
} 

private void Grid_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    grid.ReleaseMouseCapture(); 
} 
+0

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

+1

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. –

+1

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

0
public void dragme(object sender, MouseButtonEventArgs e) 
    { 
     if (_Move.IsChecked == true) 
      db.Attach((DependencyObject)sender); 

}

//// MouseDragElementBehavior db;

private void canvass_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
if (_Move.IsChecked == true && filmgrid.Visibility == Visibility.Visible)// == true) 
      { 
       filmgrid.PreviewMouseDown += new MouseButtonEventHandler(dragme); 
      } 

}

2

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(); 
    } 
Questions connexes