Как использовать элементы управления Xamarin.Form и собственные элементы управления На той же странице

Я хочу использовать Xamarin.Form Control внутри своих собственных контрольных элементов Android. На моей основной странице Android есть способ загрузить страницу Xamarin.Form внутри моего собственного фрагмента Android или LinearLayout?

В соответствии с Xamarin это возможно. Но я не могу найти, как добиться этого.

http://xamarin.com/forms

Ответ 1

Там обсуждается несколько вещей, так голые со мной: -

Фрагмент изображения, из которого я понимаю: -

 "Not only are Xamarin.Forms pages mixable with custom screens" ...

Это похоже на то, что упоминает @Stephane, позволяющее приложению использовать собственные экраны , а как экраны Xamarin.Forms. Каждая страница-заглушка платформы может представить общую страницу Xamarin.Forms в любой точке приложения. Вам не нужно использовать Xamarin.Forms Навигационный стек.

 "but you can embed custom views built directly against Xamarin.IOS and Xamarin.Android into Xamarin.Forms pages."

Это то, что упоминает @Sten, где, если вы создаете специфичную для платформы ContentRenderers, вы можете визуализировать любые собственные средства управления в существующую Xamarin.Forms, передав этот общий Просмотр для каждого рендеринга платформы.

Итак, например, если у вас был Вид: -

 public class MyView : ContentView
 {
     // Create some bindable properties here that can be used in your platform specific renderer,
     // i.e. DisplayText etc.
 }

Вы можете использовать приведенное выше в определении страницы Xamarin.Forms, а затем создать определенные для платформы средства визуализации, которые будут вызываться для рендеринга содержимого.

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

Например, в ContentRenderer для события OnElementChanged вы можете сделать что-то вроде следующего для WindowsPhone: -

 protected override void OnElementChanged(Xamarin.Forms.Platform.WinPhone.ElementChangedEventArgs<MyView> e)
 {
     base.onElementChanged(e);
     ...
     System.Windows.Controls.TextBox objPlatformSpecificTextBox = new System.Windows.Controls.TextBox();
     ... 
     ...

Однако то, что @Gulshan действительно хочет, я считаю, что главная страница, центральная, с Xamarin.Forms содержимое будет отображаться в определенную точку на уже существующей собственной странице.

Его вид-обратный, в мышлении, однако это все еще возможно: -

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

Например, в WindowsPhone вы сделаете это через: -

        PhoneApplicationPage objInnerPage_Temp = new PhoneApplicationPage();
        UIElement objInnerContent = App.GetMainPage().ConvertPageToUIElement(objInnerPage_Temp);

на специальной странице на платформе .

Затем вы можете вставить отображаемое содержимое в собственный контейнер, подходящий на платформе, т.е. Сетка.

Обновление 1: -

==========

Хотя это очень легко сделать на WindowsPhone, похоже, что это невозможно при попытке чего-то похожего в Android.

Создание страницы Android сильно заблокировано, т.е. вы не можете получить доступ к частным полям для canvas и/или макет, который он использует внутри AndroidActivity.

Если бы это было возможно, вы могли бы повторно использовать это и отобразить содержимое, а добавить, похожее на решение для платформы WindowsPhone.

Кроме того, класс Платформа помечен как внутренний также, предотвращая другой способ создания отображаемого содержимого.

Была надежда, что я думаю о приближении к ней из Фрагмента реализации генерации Activity в нее, и это может сработать. Однако проблема здесь в том, что реализация в Xamarin.Forms ожидает наличия ActionBar, которого нет, и они не проверяют сценарий if, если разрешить выполнение продолжить, если он недоступен, поэтому он генерирует исключение, предотвращающее создание содержимого страницы.

Не кажется ли это возможным?, если они не открывают поля макета/холста в AndroidActivity или не задают проблему ожидания ActionBar.

Ответ 2

Вероятно, вы ищете собственный рендерер.

  • В проекте Forms создайте класс MyView, который наследует от View (или другого подходящего класса, например ContentView, если у вас будут дочерние представления и т.д.)
  • В проекте Android создайте класс рендеринга MyViewRenderer, который наследует ViewRenderer
  • Добавить атрибут к этому классу, который указывает на его рендерер перед объявлением пространства имен [assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
  • В MyViewRenderer переопределите OnElementChanged, вызовите base.SetNativeView(ctl), где ctl - это экземпляр вашего собственного элемента управления

Взгляните на руководство Xamarin

Еще один ресурс в Xamarin Forums.

После изучения проблемы и реализации моей собственной границы я бы сказал, что VisualElementRenderer<TElement> - лучший рендерер для использования. Если вы используете это все, что вам нужно сделать, это переопределить OnElementChanged и сделать NativeView.Add(customUIView) и скопировать свойства из экземпляра MyView. Для обработки динамических изменений в этих свойствах переопределите OnElementPropertyChanged и обновите экземпляр customUIView

Ответ 3

Как уже обсуждалось, это довольно просто на iOS (с .CreateViewController()) и WP (.ConvertPageToUIElement()).

Но на Android все тоже не потеряно: вы можете использовать .GetView() расширение из http://www.arturdr.ru/android/xamarin-forms-i-slozhnosti-integratsii-v-android-prilozheniya/

Вот пример того, как обернуть страницу Xamarin.Forms в Android AlertDialog, используя этот метод: https://github.com/OlexaLe/XFPageAsAndroidDialog

Ответ 4

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

Продвинутые пользователи могут, конечно, попробовать это, но мои разговоры с другими разработчиками показывают, что это создает много дополнительной работы и накладных расходов. Лучший путь вперед - либо использовать Xamarin.Forms исключительно для ваших просмотров, либо использовать собственные представления для платформы.

Вот скриншот страницы Xamarin Xamarin.Forms(снято 13 мая 2015 года):

enter image description here

Ответ 5

Вы можете создать новый Activity, который поддерживается Xamarin.Forms, наследуя от Xamarin.Forms.Platform.Android.AndroidActivity и запуская это новое действие из другого в вашем приложении Xamarin.Android.