Xamarin.Forms Reorderable WrapLayout

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

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

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

Любая помощь в создании этого возможна.

1 ответ

Решение

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

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

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 в настоящее время не предоставляет вам доступ к событиям касания. Вы можете написать пользовательские средства визуализации для ячеек на iOS и Android, которые позволят вам получать доступ к событиям типа TouchesBegan и TouchesEnded на обеих платформах.

Эта ссылка на Xamarin дает пошаговые инструкции по интеграции сенсорных приложений на iOS и Android.

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

Другие вопросы по тегам