2017-02-07 1 views
1

J'ai un groupe de cellules (de type StackLayout) et elles sont toutes dans un WrapLayout. Je ne peux pas sembler comprendre comment le rendre réordonnable, semblable à Drag & Drop ListView.Xamarin.Forms Reorderable WrapLayout

Voici le WrapLayout:

WrapLayout layout = new WrapLayout 
{ 
    Spacing = 5, 
    Orientation = StackOrientation.Horizontal, 
    Padding = new Thickness(5, Device.OnPlatform(20, 5, 5), 5, 5), 
    HorizontalOptions = LayoutOptions.FillAndExpand, 
    VerticalOptions = LayoutOptions.FillAndExpand, 
}; 

Et voici une cellule:

// Configure cell 
var cell = new StackLayout 
{ 
    WidthRequest = Device.Idiom == TargetIdiom.Phone ? 60 : 140, 
    HeightRequest = Device.Idiom == TargetIdiom.Phone ? 60 : 50, 
    BackgroundColor = Color.FromRgb(60, 56, 72), 
    Children = { 
     new Label { 
      Text = Device.Idiom == TargetIdiom.Phone ? book.Contains("1") || book.Contains("2") || book.Contains("3") ? book.Substring(0,4).Replace(" ", "") : book.Substring(0,2) : book, 
      FontSize = 18, 
      TextColor = Color.White, 
      LineBreakMode = LineBreakMode.TailTruncation, 
      VerticalOptions = LayoutOptions.FillAndExpand, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalTextAlignment = TextAlignment.Center, 
      HorizontalTextAlignment = TextAlignment.Center 
     } 
    } 
}; 
layout.Children.Add(cell); 

Et voici ce que l'application ressemble en fait à partir de maintenant: The App

Toute aide en rendant cela possible est apprécié.

Répondre

1

Eh bien, le WrapLayout auquel vous faites référence est une mise en page personnalisée qui a été créée comme l'une des démos par les développeurs, je crois. Pour avoir une fonctionnalité glisser-déposer, vous devez l'implémenter manuellement.

Personnellement, je joindre un gestionnaire d'événements à l'événement taraudés de la cellule:

var cell = new StackLayout 
{ 
    Tapped += Cell_Tapped; 
    WidthRequest = Device.Idiom == TargetIdiom.Phone ? 60 : 140, 
    HeightRequest = Device.Idiom == TargetIdiom.Phone ? 60 : 50, 
    BackgroundColor = Color.FromRgb(60, 56, 72), 
    Children = { 
     new Label { 
      Text = Device.Idiom == TargetIdiom.Phone ? book.Contains("1") || book.Contains("2") || book.Contains("3") ? book.Substring(0,4).Replace(" ", "") : book.Substring(0,2) : book, 
      FontSize = 18, 
      TextColor = Color.White, 
      LineBreakMode = LineBreakMode.TailTruncation, 
      VerticalOptions = LayoutOptions.FillAndExpand, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalTextAlignment = TextAlignment.Center, 
      HorizontalTextAlignment = TextAlignment.Center 
     } 
    } 
}; 
layout.Children.Add(cell); 

puis créer un gestionnaire d'événements:

void Cell_Tapped(object sender, EventArgs e) 
{ 
    // Stuff you want to do with that cell 
    // Make the current selected cell invisible, attach it to a boxview that is being moved by the tap event 
} 

Ce serait cependant ne fonctionne que pour un robinet et non une véritable implémentation glisser-déposer, et Xamarin.Forms ne vous donne pas actuellement accès aux événements tactiles. Vous pourriez écrire des Renderers personnalisés pour les cellules sur iOS et Android qui vous permettraient d'accéder aux événements de type TouchesBegan et TouchesEnded sur les deux plates-formes.

Ce Xamarin link propose des solutions pas à pas pour intégrer le tactile sur iOS et Android.

J'espère que cela aide, je suis sûr qu'il existe différentes implémentations de cela.

+0

Alors, comment puis-je déplacer la boîte avec leur doigt? – ctkrocks

+1

Implémentation paresseuse: laissez un autre tapoter sur une autre partie de l'écran pour indiquer que le StackLayout/cellule sélectionné doit être déplacé, réorganisé et actualisé. Implémentation non-paresseuse: utilisez certainement les Renderers personnalisés sur chaque plate-forme. Cela vous permettra d'intercepter le delta en mouvement en utilisant les événements liés au toucher, et une fois l'événement tactile terminé/le doigt est levé, vous calculerez où le StackLayout/cellule est placé en utilisant les coordonnées. Les Custom Renderers sont votre meilleur pari je pense. – nkorai

+0

Génial. Certainement besoin d'utiliser l'implémentation non paresseuse. : P – ctkrocks