2009-10-27 11 views
3

Nous essayons de comprendre comment faire glisser un élément d'un conteneur LibraryStack sur un ScatterView, comme le fonctionnement des exemples d'applications de visionneuse de photos. Actuellement, l'article retourne juste dans LibraryStack après que nous l'ayons fait glisser. Nous pouvons glisser et déposer des éléments dans d'autres LibraryStacks ou LibraryBars.Utilisation de LibraryStacks dans un ScatterView sur surface

Voici un échantillon de ce que nous essayons:

<s:SurfaceWindow x:Class="Idia_seminar.SurfaceWindow1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:s="http://schemas.microsoft.com/surface/2008" 
Title="Idia_seminar" 
> 
<s:SurfaceWindow.Resources> 
<ImageBrush x:Key="WindowBackground" Stretch="None" Opacity="0.6" ImageSource="pack://application:,,,/Resources/WindowBackground.jpg"/> 
</s:SurfaceWindow.Resources> 

<Grid Background="{StaticResource WindowBackground}" > 
    <s:ScatterView Name="scatterView1" AllowDrop="True"> 
     <s:SurfaceButton Name="surfaceButton1">Button</s:SurfaceButton> 
     <s:LibraryStack AllowDrop="True"> 
      <s:LibraryStackItem Content="hello"></s:LibraryStackItem> 
     </s:LibraryStack> 
    </s:ScatterView> 
</Grid> 
</s:SurfaceWindow> 

Merci!

Répondre

3

Ceci est certainement faisable. J'ai préparé un exemple qui vous permet de faire glisser des éléments d'une barre de bibliothèque située dans un scatterview et de déposer des éléments sur le scatterview où ils apparaissent comme de nouveaux scatterviewitems.

Je ne sais pas où vous êtes allé mal, mais pour glisser/déposer au travail, ce qui suit doit se produire:

  1. La cible de dépôt doit avoir AllowDrop à true
  2. La baisse cible doit être visible pour frapper les tests (généralement accompli en définissant un fond autre que nul - j'utiliser Transparent)
  3. la cible de dépôt doit gérer l'événement drop et faire quelque chose d'intelligent avec les données

Voici mon XAML:

<s:ScatterView AllowDrop="True" Background="Transparent" 
     x:Name="scatterView" s:SurfaceDragDrop.Drop="scatterView_Drop"> 
    <s:SurfaceButton Name="surfaceButton1">Button</s:SurfaceButton> 
     <s:LibraryStack> 
      <s:LibraryStackItem Content="Hello"></s:LibraryStackItem> 
     </s:LibraryStack> 
    </s:ScatterView> 
</s:ScatterView> 

Et dans le code, nous prenons en charge l'événement Goutte

private void scatterView_Drop(object sender, SurfaceDragDropEventArgs e) 
{ 
    Console.WriteLine("Got drop: " + e.Cursor.Data); 
    var newItem = new ScatterViewItem(); 
    // Rely on .ToString() on the data. A real app would do something more clever 
    newItem.Content = e.Cursor.Data; 
    // Place the new item at the drop location 
    newItem.Center = e.Cursor.GetPosition(scatterView); 
    // Add it to the scatterview 
    scatterView.Items.Add(newItem); 
} 

De toute évidence, le code ne gère pas ci-dessus en faisant glisser les éléments vers le librarybar. Je laisse cela comme un exercice au lecteur ;-)

Le guide MSDN suivant est quelque chose que je pense vraiment que vous devriez lire: http://msdn.microsoft.com/en-us/library/ee804812.aspx

+0

Très utile, merci! – jackbot

1

Vous devez définir le pinceau d'arrière-plan sur la dispersion à une couleur, c'est-à-dire transparent, même pour saisir des événements de dépôt.

vous devez également utiliser SurfaceDragDrop.

SurfaceDragDrop.AddDropHandler (scatterView1, OnCursorDrop); AddHandler (ScatterViewItem.ScatterManipulationStartedEvent, nouveau ScatterManipulationStartedEventHandler (OnManipulationStarted));

private void OnManipulationStarted(object sender, RoutedEventArgs args) 

{ ScatterViewItem SVI = args.OriginalSource comme ScatterViewItem; if (svi! = Null) // & & DragDropScatterView.GetAllowDrag (svi)) { svi.BeginDragDrop (svi.DataContext); }}

private void OnCursorDrop(object sender, SurfaceDragDropEventArgs args) 

{ SurfaceDragCursor droppingCursor = args.Cursor;

// Add dropping Item that was from another drag source. 
if (!scatterView1.Items.Contains(droppingCursor.Data)){ 
    scatterView1.Items.Add(droppingCursor.Data); 

    var svi = scatterView1.ItemContainerGenerator.ContainerFromItem(droppingCursor.Data) as ScatterViewItem; 
    if (svi != null){ 
     svi.Center = droppingCursor.GetPosition(scatterView1); 
     svi.Orientation = droppingCursor.GetOrientation(scatterView1); 
     svi.Height = droppingCursor.Visual.ActualHeight; 
     svi.Width = droppingCursor.Visual.ActualWidth; 
     svi.SetRelativeZIndex(RelativeScatterViewZIndex.Topmost); 
    } 
} 

}

Tout cela est basiquement d'un exemple dans le sdk, je ne me souviens pas que l'un d'eux, il est tristement.

Cheers,

Stian Farstad