Il y a un "champ" sur lequel certains éléments sont draggable:Silverlight 4: pourquoi les objets ne sont pas mobiles?
Voici un code XAML:
<Canvas Height="180" Width="169" >
<Image Canvas.Left="0" Canvas.Top="0" Height="180" Width="149"
Source="../Picts/field.png" />
<Pages:FieldItem x:Name="Item2" Canvas.Left="129" Canvas.Top="34"
MouseLeftButtonDown="Item1_OnMouseLeftButtonDown"
MouseLeftButtonUp="Item1_MouseLeftButtonUp"
MouseMove="Item1_MouseMove"
/>
</Canvas>
et code-behind:
private bool bIsCaptured = false;
double mouseVerticalPosition;
double mouseHorizontalPosition;
private void Item1_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
((FrameworkElement)sender).CaptureMouse();
bIsCaptured = true;
mouseVerticalPosition = e.GetPosition(null).Y;
mouseHorizontalPosition = e.GetPosition(null).X;
}
private void Item1_MouseMove(object sender, MouseEventArgs e)
{
if (bIsCaptured)
{
UserControl item = sender as UserControl;
if (item != null)
{
// Calculate the current position of the object.
double deltaV = e.GetPosition(null).Y - mouseVerticalPosition;
double deltaH = e.GetPosition(null).X - mouseHorizontalPosition;
double newTop = deltaV + (double)item.GetValue(Canvas.TopProperty);
double newLeft = deltaH + (double)item.GetValue(Canvas.LeftProperty);
// Set new position of object.
item.SetValue(Canvas.TopProperty, newTop);
item.SetValue(Canvas.LeftProperty, newLeft);
// Update position global variables.
mouseVerticalPosition = e.GetPosition(null).Y;
mouseHorizontalPosition = e.GetPosition(null).X;
}
}
}
private void Item1_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
UserControl item = sender as UserControl;
bIsCaptured = false;
if (item != null)
{
item.ReleaseMouseCapture();
}
}
Ma tâche est d'afficher une collection d'éléments liés à une liste d'objets. Comment faire est décrit dans le sujet: Silverlight 4: how to display list of custom controls (not in list order).
Le seul manque de l'approche proposée est la suivante: les articles ne sont pas draggable plus ...
ici si la mise à jour du code XAML des contrôles « titulaire » (fournie à des fins de cohérence):
<Canvas Height="180" Width="169" Background="Beige" HorizontalAlignment="Center" >
<Image Canvas.Left="0" Canvas.Top="0" Height="180" Width="149"
Source="../Picts/field.png" />
<Pages:MyItemsControl ItemsSource="{Binding SquadFieldPlayers}">
<Pages:MyItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Height="180" Width="169" Background="Transparent"
HorizontalAlignment="Center" />
</ItemsPanelTemplate>
</Pages:MyItemsControl.ItemsPanel>
<Pages:MyItemsControl.ItemTemplate>
<DataTemplate>
<Pages:FieldItem
MouseLeftButtonDown="Item1_OnMouseLeftButtonDown"
MouseLeftButtonUp="Item1_MouseLeftButtonUp"
MouseMove="Item1_MouseMove"
/>
</DataTemplate>
</Pages:MyItemsControl.ItemTemplate>
</Pages:MyItemsControl >
</Canvas>
Tous les gestionnaires d'événements de souris sont appelés, mais les éléments ne sont pas vraiment mobiles ... pourquoi?
Vous voulez seulement que le contrôle FieldItem soit mobile? –
Oui, chaque FieldItem devrait pouvoir être déplacé par la souris. Aussi, j'aimerais que l'objet de données soit notifié lorsque la position de l'objet a changé – Budda