В Telerik ListView в формах Xamarin как мне обработать событие правого щелчка для элемента в Windows? - PullRequest
0 голосов
/ 24 марта 2020

В моей компании есть кроссплатформенное приложение, которое в основном используется на мобильных устройствах, использующих Xamarin, с некоторыми элементами управления от Telerik. Недавно мы добавили больше работы, чтобы заставить его работать должным образом на всех платформах (изначально это был порт приложения Android Java). Точка преткновения на данный момент - Windows: хотя почти все работает довольно хорошо, Telerik ListView доставляет нам проблемы.

В настоящее время мы используем длинное событие нажатия, чтобы показать пользовательский интерфейс для удаления элемента. Это работает отлично. Это использует GestureRecognizer в Telerik ListView. Проблема в том, что мы не можем найти способ получить похожее поведение с помощью мыши: нажатие на элемент имеет эффект, который мы должны сохранить, и он уже содержит незаменимый флажок. В идеале я бы установил событие щелчка правой кнопкой мыши и покончил бы с ним, но в элементе управления Telerik ListView нет события щелчка правой кнопкой мыши. Поскольку элемент управления не является элементом UIE, я не могу найти его дочерние элементы любым способом, к которому я привык, и сами узлы, похоже, заменяются во время выполнения в живом визуальном дереве.

Я вижу Элемент управления ExtendedListViewItem, который, как мне кажется, хотел бы предоставить обработчик событий мыши, но я не знаю, как ссылаться на эти узлы сверху. Это становится еще сложнее, поскольку все эти страницы находятся внутри библиотеки классов. NET Standard 2.0, поэтому любой код c, специфичный для платформы (например, VisualTreeHelper), можно добавить только в приложение UWP и затем каким-то образом абстрагировать обратно библиотека общего пользовательского интерфейса.

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

1 Ответ

1 голос
/ 26 марта 2020

Я оценил подход к созданию события RightClicked в части UWP компонента RadListView и предоставил это уведомление в элемент управления XamarinForms. Технически это возможно, но во время написания связанного с UWP класса, который должен обеспечивать уведомление, является внутренним. Это означает, что использование UWP ListViewItems для обеспечения этого уведомления невозможно.

Поскольку, скорее всего, вы уже установили пользовательский ItemTemplate для RadListView в XamarinForms, вы можете рассмотреть возможность создания пользовательского Элемент управления XamrinForms (например, «Сетка», «Рамка», «Граница», «Метка ...»), который имеет настраиваемый модуль визуализации для UWP. Этот рендерер может подписаться на событие UIElement.RightTapped и повторно передать уведомление в часть элемента управления XamarinForms.

public class MyRightClickGridRenderer : ViewRenderer<MyRightClickGrid, Grid>
{
    protected override void OnElementChanged(ElementChangedEventArgs<MyRightClickGrid> e)
    {
        if (this.Element != null)
        {
            if (this.Control == null)
            {
                var uwpGrid = new Grid { IsRightTapEnabled = true, Background = new SolidColorBrush(Colors.Transparent) };
                uwpGrid.RightTapped += UwpGrid_RightTapped;
                this.SetNativeControl(uwpGrid);
            }
        }
        if (this.Element == null)
        {
            if (this.Control != null)
            {
                ((Grid)this.Control).RightTapped -= UwpGrid_RightTapped;
            }
        }
    }

    private void UwpGrid_RightTapped(object sender, Windows.UI.Xaml.Input.RightTappedRoutedEventArgs e)
    {
        ((MyRightClickGrid)this.Element).RaiseRightClicked(sender);
    }
}

, а в проекте XamarinForms вы можете создать нечто подобное

public class MyRightClickGrid : Grid
{
    public event EventHandler<TappedEventArgs> RightTapped;
    public void RaiseRightClicked(object sender)
    {
        this.RightTapped?.Invoke(this, new TappedEventArgs(null));
    }
}

После создания этого элемента управления его можно использовать в XAML следующим образом:

<telerikListView:RadListView>
  <telerikListView:RadListView.ItemTemplate>
    <DataTemplate>
      <telerikListViewPrimitives:ListViewTemplateCell>
        <telerikListViewPrimitives:ListViewTemplateCell.View>
          <MyNamespace:MyRightClickGrid >
            ***
          </MyNamespace:MyRightClickGrid >
        </telerikListViewPrimitives:ListViewTemplateCell.View>
      </telerikListViewPrimitives:ListViewTemplateCell>
    </DataTemplate>
  </telerikListView:RadListView.ItemTemplate>
</telerikListView:RadListView>

Дайте мне знать, если это работает для вас.

PS Одно из преимуществ этого подхода является то, что вы можете использовать тот же рендерер, чтобы получить позицию, где произошел щелчок. Эта функция все еще не поддерживается XamarinForms, и вы должны создать аналогичные логи c для каждой платформы, чтобы получить эту информацию.

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