J'essaie de personnaliser un bouton d'image pour utiliser des images spécifiques sur des appareils particuliers pour Android, il affichera une image tandis que dans iOS, il affichera une autre image à l'aide de moteurs de rendu personnalisés
J'ai terminé du côté Android mais j'ai remarqué que iOS utilise différentes variables memeber au lieu de simplement "this.SetBackground (Some Resource)" utilisé du côté Android.
iOS [assembly: ExportRenderer(typeof(FingerPrintLabel), typeof(FingerPrintLabelRenderer))] namespace FlipXamarin.iOS.CustomRenderers { public class FingerPrintLabelRenderer : ImageButtonRenderer { protected override void OnElementChanged(ElementChangedEventArgs<ImageButton> e) { base.OnElementChanged(e); ///if(iOS.version == 8) show fingerprint icon ///if(iOS.version == 10 and) show FaceId icon } } }
Android [assembly: ExportRenderer(typeof(FingerPrintLabel), typeof(FingerPrintLabelRenderer))] namespace FlipXamarin.Droid.Renderers { public class FingerPrintLabelRenderer : ImageButtonRenderer { public FingerPrintLabelRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<ImageButton> e) { base.OnElementChanged(e); this.SetBackground(Resources.GetDrawable(Resource.Drawable.fingerprint_2x)); } } }
namespace FlipXamarin.Controls { public class FingerPrintLabel : ImageButton { public FingerPrintLabel() { } } }
3 Réponses :
Comme @Jason l'a indiqué dans les commentaires, vous n'avez pas besoin d'un moteur de rendu personnalisé pour afficher une image différente puisque vous pouvez faire tout cela à partir du projet partagé en utilisant la classe d'assistance Device
.
Mais, pour répondre à votre question, si vous souhaitez mettre à jour l'image du ImageButton
à partir d'un CustomRenderer
sous iOS, vous pouvez le faire comme ceci:
//Do your validation as you wish, this was just an example. var image = UIDevice.CurrentDevice.CheckSystemVersion(10, 0) ? UIImage.FromBundle("facescan.jpg") : UIImage.FromBundle("fingerprint.jpg"); //The Control property is an UIButtton Control?.SetImage(image?.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal), UIControlState.Normal);
Dans Xamarin Forms, vous pouvez installer Xam.Plugin.DeviceInfo sur déterminer quel numéro de version.
Xaml comme suit:
using System.ComponentModel; if (Device.RuntimePlatform == Device.iOS) { Console.WriteLine("version is -- " + CrossDeviceInfo.Current.Version); if (Convert.ToInt32(CrossDeviceInfo.Current.Version) >= 10) { MyImageButton.Source = "FaceId.png"; } else { MyImageButton.Source = "fingerprint.png"; } } else if (Device.RuntimePlatform == Device.Android) { MyImageButton.Source = "fingerprint.png"; }
Ensuite, dans ContentPage , si a installé DeviceInfo Nuget, vous pouvez utiliser comme suivez:
<ImageButton x:Name="MyImageButton" Source="fingerprint.png"/>
Si vous ne connaissez pas l'installation du package Nuget, vous pouvez vous référer à ceci Installez et utilisez un package dans Visual Studio .
Je ne savais pas que vous pouviez référencer les fichiers du projet Formulaires.
@AnthonyR Okey, regardez ceci. ( docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interf ace /… ) Je pense que l'utilisation de Custom Renderer ici ne rend pas le programme plus concis. vous utilisez le moteur de rendu personnalisé, vous devez ajouter un fichier de rendu à chacun d'iOS et d'Android, et Forms n'a besoin que d'ajouter des images à leurs plates-formes respectives. Le moteur de rendu personnalisé est utilisé lorsque les formulaires ne peuvent pas être implémentés, afin que vous puissiez garder le code aussi simple et pratique que possible.
Vous pouvez simplement utiliser la plateforme XAML MArkup OnPlatform.
Voici un exemple:
<ImageButton HorizontalOptions="Center" VerticalOptions="Center"> <ImageButton.Source> <OnPlatform x:TypeArguments="ImageSource" iOS="https://www.apple.com/ac/structured-data/images/knowledge_graph_logo.png?201606271147" Android="https://d3nevzfk7ii3be.cloudfront.net/igi/hAgr2LwD6AECIwsh.large" /> </ImageButton.Source> </ImageButton>
Ce qui donne:
Est-il vraiment nécessaire d'utiliser un moteur de rendu personnalisé? La classe d'assistance Device permettra à votre plate-forme et version de déterminer lors de l'exécution, vous pouvez donc simplement définir l'image appropriée à partir de votre code Forms partagé.