22

Xamarin Monkeys: Xamarin.Forms - ContentView Lifecycle

 2 years ago
source link: https://xamarinmonkeys.blogspot.com/2021/09/xamarinforms-contentview-lifecycle.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Xamarin.Forms - ContentView Lifecycle

In this blog post, you will learn how to use OnAppearing and OnDisAppearing in ContentView in Xamarin forms.

Introduction

Xamarin.Forms code runs on multiple platforms - each of which has its own filesystem. This means that reading and writing files is most easily done using the native file APIs on each platform. Alternatively, embedded resources are a simpler solution to distribute data files with an app.

ContentView LifeCycle

  • OnAppearing - raised when a View is about to appear on the screen.
  • OnDisAppearing - raised when a View is about to disappear from the screen.

Problem

In Xamarin.froms Content view or any custom view we develop. Here there are no lifecycle methods like OnStart, OnAppearing. this one is a major requirement for Xamarin.forms.

Solution

There is one workaround for OnAppearing and OnDisappearing in ContentView we can invoke the parent page OnAppearing and OnDisAppearing to our ContentView. Please follow all steps.

Prerequisites

  • Visual Studio 2017 or later (Windows or Mac)

Let's Start,

Setting up a Xamarin.Forms Project

Start by creating a new Xamarin.Forms project. You will learn more by going through the steps yourself.

Create a new or existing Xamarin forms(.Net standard) Project. With Android and iOS Platform.

01.png

Create Interface

Here, need to create an interface for the renderer resolver

IRendererResolver.cs

public interface IRendererResolver { object GetRenderer(VisualElement element);

bool HasRenderer(VisualElement element); }

Platform Implementation

Android Implementation

Create AndroidRendererResolver in your android project. And add the following code snippets.

AndroidRendererResolver.cs

[assembly: Dependency(typeof(AndroidRendererResolver))] namespace XamarinStudy.Droid.Renderer { public class AndroidRendererResolver: IRendererResolver { public object GetRenderer(VisualElement element) { return Xamarin.Forms.Platform.Android.Platform.GetRenderer(element); }

public bool HasRenderer(VisualElement element) { return GetRenderer(element) != null; } } }

iOS Implementation

Create an iOSRenderderResolver for iOS in your iOS project. And copy-paste the following code.

IosRendererResolver.cs

[assembly: Dependency(typeof(IosRendererResolver))] namespace XamarinStudy.iOS.Renderer { public class IosRendererResolver: IRendererResolver { public object GetRenderer(VisualElement element) { return Xamarin.Forms.Platform.iOS.Platform.GetRenderer(element); }

public bool HasRenderer(VisualElement element) { return GetRenderer(element) != null; } } }

Setup UI

Now, create a UI for your requirement in your ContentView.

CommonListview.xaml

<?xml version="1.0" encoding="UTF-8" ?> <ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:sfl="clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms" xmlns:sfp="clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms" x:Class="XamarinStudy.CustomView.CommonListview"> <ContentView.Content> <ListView ItemsSource="{Binding ProductList}" ItemSelected="ListView_ItemSelected"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout HeightRequest="100"> <Label Text="{Binding .}"/> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </ContentView.Content> </ContentView>

ContentView LifeCycle

Following code for OnAppearing and OnDisAppearing in your ContentView. Now you can do whatever you want in your ContentView OnAppearing and OnDisAppearing.

CommonListView.xaml.cs

public partial class CommonListview : ContentView { public CommonListview() { InitializeComponent(); }

private ContentPage _parentPage; private bool _registered;

protected virtual void OnAppearing() { }

protected virtual void OnDisappearing() { }

protected override void OnPropertyChanged([CallerMemberName] string propertyName = null) { base.OnPropertyChanged(propertyName);

if (propertyName.Equals("Renderer", StringComparison.OrdinalIgnoreCase)) { var rr = DependencyService.Get<IRendererResolver>();

if (rr.HasRenderer(this)) { Unregister();

var parent = Parent; while (parent?.Parent != null && !(parent is ContentPage)) { parent = parent.Parent; }

if (parent is ContentPage page) { _parentPage = page; Register(); } } else { Unregister(); } } }

private void Register() { if (_parentPage != null && !_registered) { _parentPage.Appearing += OnAppearing; _parentPage.Disappearing += OnDisappearing;

_registered = true; } }

private void Unregister() { if (_parentPage != null && _registered) { _parentPage.Appearing -= OnAppearing; _parentPage.Disappearing -= OnDisappearing;

_registered = false; _parentPage = null; } }

private void OnAppearing(object sender, EventArgs e) { OnAppearing(); }

private void OnDisappearing(object sender, EventArgs e) { OnDisappearing(); }

}

OnAppearing

See below screenshot of the breakpoint triggered in OnAppearing when the view is loaded.

OnAppearing.png

OnDisAppearing

See below screenshot of the breakpoint triggered in OnDisAppearing when the view is unloaded.

OnDisAppearing.png
Conclusion

I hope you have understood how to use add OnAppearing and OnDisAppearing in ContentView in Xamarin.Forms App.

Thanks for reading. Please share your comments and feedback. Happy Coding :)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK