Перетаскивание в макете сетки в формах Xamarin - PullRequest
0 голосов
/ 27 сентября 2018

На моей странице XAML настроена следующая сетка.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <BoxView BackgroundColor="Red" Grid.Row="0" Grid.Column="0">
        <BoxView.GestureRecognizers>
            <PanGestureRecognizer PanUpdated="PanGestureRecognizer_OnPanUpdated"/>
        </BoxView.GestureRecognizers>
    </BoxView>
    <BoxView BackgroundColor="Green" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" />
    <BoxView BackgroundColor="Red" Grid.Row="0" Grid.Column="3" />

    <BoxView BackgroundColor="Blue" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" />
    <BoxView BackgroundColor="Purple" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2"/>

    <BoxView BackgroundColor="Aqua" Grid.Row="2" Grid.Column="0" />
    <BoxView BackgroundColor="Fuchsia" Grid.Row="2" Grid.Column="1" />
    <BoxView BackgroundColor="GreenYellow" Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2">

    </BoxView>

</Grid>

Я хочу добавить функцию перетаскивания в каждом окне.Идея состоит в том, чтобы я мог перетаскивать каждый вид блока и перетаскивать его на другой вид блока с таким же интервалом столбцов.Может кто-нибудь посоветовать, пожалуйста, как это сделать?Пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 сентября 2018

К сожалению, в Xamarin.Forms пока нет встроенной функции перетаскивания.Вы все еще можете реализовать его самостоятельно, используя PanGestureRecognizer.

. Вы можете добавить распознаватель жестов к своему виду, например Label, например:

<Label>
   <Label.GestureRecognizers>
      <PanGestureRecognizer PanUpdated="PanGestureRecognizer_OnPanUpdated" />
   </Label.GestureRecognizers>
</Label>

Теперь в PanUpdatedОбработчик событий вы можете использовать TranslationX и TranslationY, чтобы перемещать представление.

private double _startTranslationX, _startTranslationY

private void PanGestureRecognizer_OnPanUpdated(object sender,
    PanUpdatedEventArgs e)
{
    var box = (BoxView) sender;
    if (e.StatusType == GestureStatus.Started)
    {
        _startTranslationX = box.TranslationX;
        _startTranslationY = box.TranslationY;
    }
    else if (e.StatusType == GestureStatus.Running)
    {
        box.TranslationX = _startTranslationX + e.TotalX;
        box.TranslationY = _startTranslationY + e.TotalY;
    }
    else if (e.StatusType == GestureStatus.Completed)
    {
        box.TranslationX = _startTranslationX + e.TotalX;
        box.TranslationY = _startTranslationY + e.TotalY;
        //handle drop here (depending on your requirements)
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...