Приложение формы Xamarin, использующее функциональные возможности собственных библиотек

Единственный специфичный для платформы код в моем приложении исходит из собственных библиотек. Так что я вижу два варианта:

1. Проекты iOS и Android, ссылающиеся на соответствующие привязки. Это потребует, чтобы они оба обрабатывали события пользовательского интерфейса, для которых требуются эти зависящие от платформы библиотеки.

2. Создайте общий проект, который будет создавать оболочки вокруг проектов привязки для создания единого API, а затем использовать директивы компилятора для выбора подходящей реализации.

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

Я считаю, что во втором варианте оба приложения будут содержать ВЕСЬ код. Я также не знаю, могу ли я использовать общий проект, если я уже использую стратегию совместного использования кода .NET Standard (требуется, поскольку стандарт .NET не поддерживает директивы компилятора).


person Justas S    schedule 25.02.2018    source источник


Ответы (1)


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

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

В ПКЛ:

public class NativeListView : ListView
{
  ...
  public event EventHandler<SelectedItemChangedEventArgs> ItemSelected;
  ...
}

В пользовательском рендерере:

Control.ItemClick += OnItemClick;

...
void OnItemClick(object sender, Android.Widget.AdapterView.ItemClickEventArgs e)
{
    ((NativeListView)Element).NotifyItemSelected(((NativeListView)Element).Items.ToList()[e.Position - 1]);
}

Но если в вашем проекте много функций для конкретной платформы. Использование общего проекта является хорошим вариантом.

Я также не знаю, могу ли я использовать общий проект, если я уже использую стратегию совместного использования кода .NET Standard (требуется, поскольку стандарт .NET не поддерживает директивы компилятора).

Я считаю, что вам нужно изменить свой проект PCL на общий проект. Конечно, некоторые модификации кодов необходимы. Но это будет немного. Если вы имеете в виду, что хотите, чтобы ваш PCL ссылался на новый Shared Project. Нет, я не думаю, что это сработает.

person Elvis Xia - MSFT    schedule 26.02.2018