Posted on Leave a comment

Override hardware back button Xamarin.Forms

Some phones support the hardware back button and this may disturb the designed navigation experience that has been implemented in the application. You can override this behavior on Android (iOS does not support a hardware back button) with the following code that has to be placed in the MainActivity.cs of your Android root folder after onCreate method.

 public override void OnBackPressed()
        {
           return;
        }

The result should look like below. After this action the hardware back button will have no effect and the whole navigation can be performed through the application.

Posted on Leave a comment

ViewModel Image binding based on Condition – XAML

If you want to show a specific image in a Xamarin.Forms app based on a condition, you can Image.Triggers

For example you have an Image element in your XAML and you want to show a different image based on a database query. In order to do that, you should place the pictures that you want to use in the appropriate folders.

  • For iOS the pictures must be located under Resources folder.
  • For Android the pictures should be in Resources/drawable
  • For UWP you must place the pictures in the root directory of the project.
 <Image WidthRequest="80"  Source="{Binding Category}" HeightRequest="80">
                                <Image.Triggers>
                                    <DataTrigger TargetType="Image" Binding="{Binding Category}" Value="ID Number">
                                        <Setter Property="Source" Value="id.png" />
                                    </DataTrigger>
                                    
                                     <DataTrigger TargetType="Image" Binding="{Binding Category}" Value="Tax Identification Number">              
                                        <Setter Property="Source" Value="tax.png" />
                                    </DataTrigger>

                                     <DataTrigger TargetType="Image" Binding="{Binding Category}" Value="Other">              
                                        <Setter Property="Source" Value="other.png" />
                                    </DataTrigger>
                                    
                                </Image.Triggers>
    </Image>

As a result your image will change upon the value of the Category element. If the Category value would be ID Number then the image should be id.png etc..

Posted on Leave a comment

Local Database with Realm – Xamarin.Forms

Realm is a very popular solution for mobile databases as it includes very nice features, it’s very quick and easy to use. It supports many platforms as well as Xamarin.

You can use realm with Xamarin.Forms after installing the nuget package. Be careful to install nuget package to Android, iOS and UWP seperate project.

Current realm version is 1.5. After choosing Realm package, nuget will also install all available requirements.

First of all in order to store items in the database, you should create a model which will represent the identity that you want to save. For example lets say that we want a Person identity so we will store Persons.

Lets create the necessary model for this case:

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

After that we  will create a test interface in which we can add some users and interact with realm.

  <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
        <Entry  x:Name="name" Placeholder="Enter Name" Margin="0,20,0,0" WidthRequest="200"  />
        <Entry x:Name="age" Placeholder="Enter Age" Margin="0,20,0,0"  WidthRequest="200" />
        <Button Text="Add a new Item" Margin="0,20,0,0" Clicked="addperson" />
        <Button Text="Load all items" Margin="0,20,0,0" Clicked="loadpersons" />
    </StackLayout>

 

To interact with the database lets create a RealHelper class which we will use to add persons and load.

public class RealmHelper
    {
        Realm realm;
        Transaction transaction;

        public RealmHelper()
        {
            realm = Realm.GetInstance();
        }


        public void AddItem(Person person)
        {

            transaction = realm.BeginWrite();
            var entry = realm.Add(person);
            transaction.Commit();
        }

        public IEnumerable<Person> GetItems()
        {
            return realm.All<Person>();
        }
    }

 

In order to make a write operation we use a transaction and we do that by creating a write with beginWrite(). More information for the functions and how they operation can be found on the documentation.

 

 

 RealmHelper rh;
        
public MainPage()
	{
	    InitializeComponent();
            rh = new RealmHelper();
        }

 

The main logic comes from the two buttons:

private async void addperson(object sender, EventArgs e)
        {
            var person = new Person();
            person.Name = name.Text;
            person.Age = age.Text;
            rh.AddItem(person);
            await DisplayAlert("Ok", "A new person was added", "OK");
        }

        private void loadpersons(object sender, EventArgs e)
        {
            IEnumerable<Person> collection = rh.GetItems();

        }

 

Putting a breakpoint in the loadPersons button we can see the stored persons.

 

initialization issues I found:

  • In the UWP project you must install realm database nuget package and not realm nuget package. That’s because some functions don’t exist in the uwp apis so if you install realm package some exceptions will occur during the opening of the app.
  • Check if fody file exists in both iOS, Android and UWP projects and the its content should be
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<RealmWeaver/>
</Weavers>
  • Be sure that all packages are updated across all projects and are the same version.