Asynchronous button events in Xamarin

Viewed 279

I'm attempting to use a Xamarin Forms Media Plugin. I am getting tripped up on trying to get my button, in my MainPage.XAML file to call the asynchronous function in my MainPage.Xaml.CS file.

The very first line of the code is giving me issues: takePhoto.Clicked += async (sender, args) =>

"Take photo" is the name of my button in my app.xaml file, but I cant seem to fetch the name of my button in my app.xaml.cs no matter what I try, so i don't know how to call this asynchronous function.

Here is the code the library uses to take a picture with the plugin - this code is in my App.Xaml.CS file:

takePhoto.Clicked += async (sender, args) =>
{
    await CrossMedia.Current.Initialize();

    var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
    {
        Directory = "Sample",
        Name = "test.jpg"
    });

    if (file == null)
        return;

    image.Source = ImageSource.FromStream(() =>
    {
        var stream = file.GetStream();
        file.Dispose();
        return stream;
    }); 
};

My button is in the App.Xaml page like so:

<Button ClassId="TakePicture"
         Text="Take Picture"
         Margin="100" 
         HorizontalOptions="CenterAndExpand"
        />

This is probably a simple question. Usually i add the Clicked = callFunction() property in the code snipped above, but i don't know how to do that if the function is asynchronous. I'd be very appreciative for any guidance.

1 Answers

you're overthinking this - just use the async keyword in the handler signature, not in the XAML

<Button ClassId="TakePicture"
     Clicked="TakePhoto"
     Text="Take Picture"
     Margin="100" 
     HorizontalOptions="CenterAndExpand"
    />

then in the code behind

protected async void TakePhoto(object sender, EventArgs a)
{
  ...
}
Related