Question

Nous essayons de comprendre comment faire glisser un élément d'un conteneur LibraryStack sur un ScatterView, comme le fonctionnement des exemples d'applications du visualiseur de photos. Actuellement, l'élément revient dans la bibliothèque après avoir été déplacé. Nous pouvons faire glisser des éléments dans d’autres LibraryStacks ou LibraryBars.

Voici un exemple 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!

Était-ce utile?

La solution

C'est certainement faisable. J'ai concocté un exemple qui vous permet de faire glisser des éléments d'une bibliothèque située dans une vue de dispersion et de déposer des éléments dans la vue de dispersion où ils apparaissent en tant que nouveaux éléments de scatterview.

Je ne sais pas trop où vous vous êtes trompé, mais pour que le glisser-déposer fonctionne, il faut que ce qui suit se produise:

  1. AllowDrop doit avoir la valeur true pour la cible de dépôt.
  2. La cible de dépôt doit être visible pour que vous puissiez effectuer des tests (généralement en définissant un arrière-plan autre que null - j’utilise 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 gérons l'événement Drop

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);
}

Évidemment, le code ci-dessus ne permet pas de faire glisser des éléments vers la barre de bibliothèque. Je laisse cela comme un exercice au lecteur ;-)

Le guide MSDN suivant est, à mon avis, quelque chose que vous devriez lire: http: //msdn.microsoft.com/en-us/library/ee804812.aspx

Autres conseils

Vous devez définir le pinceau d’arrière-plan du diagramme de dispersion sur une couleur, c'est-à-dire transparente. pour même saisir des événements de largage.

vous devez également utiliser SurfaceDragDrop.

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

private void OnManipulationStarted(object sender, RoutedEventArgs args)

{     ScatterViewItem svi = args.OriginalSource as ScatterViewItem;     if (svi! = null) // & amp; & amp; 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 ceci est fondamentalement tiré d'un exemple du sdk, je ne me souviens plus lequel d'entre eux est malheureusement.

A bientôt,

Stian Farstad

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top