2010-03-22 8 views
3

Nous essayons d'implémenter le glisser-déposer dans Silverlight (3). Nous souhaitons que les utilisateurs puissent faire glisser des éléments d'une arborescence vers une autre partie de l'interface utilisateur. L'élément parent est une grille, et nous avons essayé d'utiliser une TranslateTransform avec les événements MouseLeftButtonDown, MouseMove (etc), comme recommandé par divers exemples en ligne. Par exemple:TranslateTransform pour glisser-déposer dans Silverlight

http://www.85turns.com/2008/08/13/drag-and-drop-silverlight-example/

Nous faisons cela dans IronPython, mais cela ne devrait être plus ou moins hors de propos. Le début du glissement est correctement initié, mais l'objet que nous faisons glisser apparaît dans le mauvais emplacement (décalage de quelques centaines de pixels vers la droite et vers le bas depuis le curseur) et je ne peux pas déterminer pourquoi.

xaml de base:

<Grid x:Name="layout_root"> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="120"/> 
    </Grid.RowDefinitions> 
    <Border x:Name="drag" Background="LightGray" Width="40" Height="15" 
    Visibility="Collapsed" Canvas.ZIndex="10"> 
     <Border.RenderTransform> 
      <TranslateTransform x:Name="transform" X="0" Y="0" /> 
     </Border.RenderTransform>    
     <TextBlock x:Name="dragText" TextAlignment="Center" 
     Foreground="Gray" Text="foo" /> 
    </Border> 
    ... 
</Grid> 

La méthode startDrag est déclenchée par l'événement MouseLeftButtonDown (sur un TextBlock dans un TreeViewItem.Header). onDrag est déclenché par MouseMove. Dans le self.root de code suivant est Application.Current.RootVisual (élément d'interface utilisateur de niveau supérieur de app.xaml):

def startDrag(self, sender, event): 
    self.root.drag.Visibility = Visibility.Visible 
    self.root.dragText.Text = sender.Text 
    position = event.GetPosition(self.root.drag.Parent) 

    self.root.drag.transform.X = position.X 
    self.root.drag.transform.Y = position.Y 

    self.root.CaptureMouse() 
    self._captured = True 

def onDrag(self, sender, event): 
    if self._captured: 
     position = event.GetPosition(self.root.drag.Parent) 
     self.root.drag.transform.X = position.X 
     self.root.drag.transform.Y = position.Y 

l'élément déplacé suit le mouvement de la souris, mais est considérablement décalée. Une idée de ce que je fais mal et comment le corriger?

Répondre

0

Il se trouve que j'aurais dû fixer la marge bénéficiaire au lieu d'utiliser TranslateTransform:

def startDrag(self, sender, event): 
    self.root.drag.Visibility = Visibility.Visible 
    self.root.dragText.Text = sender.Text 

    self.root.CaptureMouse() 
    self._captured = True 
    self.root.MouseLeftButtonUp += self.stopDrag 
    self.root.MouseLeave += self.stopDrag 
    self.onDrag(sender, event) 

def onDrag(self, sender, event): 
    if self._captured: 
     position = event.GetPosition(self.root.layout_root) 
     self.root.drag.Margin = Thickness(position.X, position.Y, 0, 0) 
     self.root.drag.UpdateLayout()