Search code examples
c#xamlxamarinxamarin.iosstaticresource

Xamarin XAML StaticResource inside another one


I have a string in my ResourceDictionary in App.xaml.

<x:String x:Key="logoEvo">.Images.logoEvo.png</x:String>

How can I use it inside another StaticResource like this:

<Image Source="{sgat:ImageResource SgatMobileOnline{StaticResource logoEvo} }" />

ImageResource's file is:

using System;
using Xamarin.Forms;
using Xamarin.Forms.Internals;
using Xamarin.Forms.Xaml;

namespace SgatMobileOnline {

    // You exclude the 'Extension' suffix when using in Xaml markup
    [Preserve(AllMembers = true)]
    [ContentProperty("Source")]
    public class ImageResourceExtension : IMarkupExtension {
        public string Source { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider) {
            if (Source == null) {
                return null;
            }
            // Do your translation lookup here, using whatever method you require
            var imageSource = ImageSource.FromResource(Source);

            return imageSource;
        }
    }
}

Thank you!


Solution

  • In App.cs

     <Application.Resources>
        <ResourceDictionary>
            <x:String x:Key="logoEvo">test.png</x:String>
        </ResourceDictionary>
    </Application.Resources>
    

    XAML:

    <Image Source="{local:ImageResourceExtension logoEvo}" />
    

    ImageResourceExtension

    namespace App1
    {
    [Preserve(AllMembers = true)]
    [ContentProperty("Source")]
    public class ImageResourceExtension : IMarkupExtension
    {
        public string Source { get; set; }
    
        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Source == null)
            {
                return null;
            }
    
            string s = Application.Current.Resources[Source] as string;
            // Do your translation lookup here, using whatever method you require
    
            var assembly = typeof(ImageResourceExtension).GetTypeInfo().Assembly;
            var assemblyString = assembly.GetName().Name.ToString();
            var imageSource = ImageSource.FromResource(assemblyString + "." + s);
            return imageSource;
        }
    }
    }
    

    PS:Make sure the image's Build Action as Embedded Resource