2017-02-07 3 views
1

У меня есть группа ячеек (типа StackLayout), и все они находятся в WrapLayout. Я не могу понять, как сделать его переупорядочиваемым, подобно Drag & Drop ListView.Xamarin.Forms Reorderable WrapLayout

Вот 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, 
}; 

И вот одна клетка:

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

А вот что приложение на самом деле выглядит как сейчас: The App

Любая помощь в том, чтобы сделать это возможным.

ответ

1

Ну, WrapLayout, о котором вы говорите, является настраиваемым макетом, который был создан как одна из них демонстрационными версиями, которые я считаю. Чтобы иметь функциональность перетаскивания, вам придется вручную ее реализовать.

Лично я бы присоединить обработчик событий к постучала событию клетки:

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

, а затем создать обработчик события:

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 
} 

Это, однако, работать только для крана и не истинная реализация перетаскивания и Xamarin.Forms в настоящее время не дает вам доступа к событиям касания. Вы можете написать Custom Renderers для ячеек на iOS и Android, которые позволят вам получить доступ к событиям типа TouchesBegan и TouchesEnded на обеих платформах.

Это Xamarin link дает пошаговые руководства по интеграции касания как на iOS, так и на Android.

Надеюсь, это поможет, я уверен, что существуют различные реализации этого.

+0

Итак, как мне перенести коробку пальцем? – ctkrocks

+1

Lazy реализация: пусть другой коснуться другой части регистра экрана в качестве точки, в которой необходимо переместить выбранную ячейку StackLayout/ячейку, изменить порядок и обновить. Нелатическая реализация: определенно используйте Custom Renderers на каждой платформе. Это позволит вам перехватить дельта в движении, используя события, связанные с касанием, и после того, как событие касания закончится/палец поднят, вы вычислите, где StackLayout/ячейка размещена с использованием координат. Я считаю, что ваши собственные рендеринги - ваш лучший выбор. – nkorai

+0

Отлично. Определенно нужно использовать не ленивую реализацию. :П – ctkrocks

Смежные вопросы