У меня есть страница Xamarin, на которой мне пришлось использовать собственный рендерер страниц Android для поддержки API, специфичного для платформы.
BasePage.xaml
передает управление MyPage.xaml
с Navigation.PushAsync()
Страница XAML: MyPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Views.MyPage" Title="My Page">
<ContentPage.Content>
</ContentPage.Content>
</ContentPage>
Средство визуализации пользовательской страницы Android для приведенного выше кода выглядит примерно так:
[assembly: ExportRenderer(typeof(MyPage), typeof(MyPageRenderer))]
namespace MyApp.Droid.Renderers
{
public class MyPageRenderer : PageRenderer
{
private Context _localContext;
private global::Android.Views.View view;
private Activity activity;
public event EventHandler ItemAdded;
public MyPageRenderer(Context context) : base(context)
{
_localContext = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
try
{
SetupUserInterface();
SetupEventHandlers();
AddView(view);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(@"ERROR: ", ex.Message);
}
}
private void SetupUserInterface()
{
activity = this.Context as Activity;
view = activity.LayoutInflater.Inflate(Resource.Layout.axml_layout, this, false);
}
protected override void OnLayout(bool changed, int l, int t, int r, int b)
{
base.OnLayout(changed, l, t, r, b);
var msw = MeasureSpec.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly);
var msh = MeasureSpec.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly);
view.Measure(msw, msh);
view.Layout(0, 0, r - l, b - t);
}
private void SetupEventHandlers()
{
//blah blah
}
private void ButtonTapped(object sender, EventArgs e)
{
//do something
//Here Navigate back to page which triggered this with outcome parameter or some event
ItemAdded(this, EventArgs.Empty);
}
}
}
Myнамерение - вернуть управление на MyPage.xaml.cs
или BasePage.xaml.cs
с MyPageRenderer
с результатом ButtonTapped
. Я использую событие ItemAdded
и обрабатываю его в коде позади этой страницы.Я не могу получить доступ к событию ItemAdded
, которое находится в Android-рендерер только из общего проекта.
Мне нужно обновить ViewModel
из BasePage
, чтобы обновлять содержимое элементов там, когда MyPage был извлечен после добавления нового элемента кнопкой назад.
Проблема: Я могу получить доступ к MyPage и BasePage, но не могу получить доступ к методу и переменным рендерера из общего проекта, потому что проект Android зависит от общего доступа, а не наоборот.
Мне нужно сделать что-то вроде ниже которая работает для несобственной страницы рендеринга BasePage:
var myPage = new MyPage();
myPage.ItemAdded += OnItemAdded;
await Navigation.PushAsync(myPage);
MyPage:
public event EventHandler ItemAdded;
.
.
void SomeMethod(){
ItemAdded(this, EventArgs.Empty);
}
Вопрос: Как передать управление из NativeRenderer обратно в общий код Xamarin Forms?
Я знаю, что мы можем передать управление классу MainActivity
, но я хочу передать управление BasePage.xaml.cs
, которое я не получил из документации.Если кто-то работал над PageRenderer, пожалуйста, предложите.