web-dev-qa-db-fra.com

Comment changer le texte de l'étiquette dans xamarin

Je suis relativement nouveau dans les formes Xamarin. J'ai découvert que je ne pouvais pas changer le texte de l'étiquette à partir du code précédent. Normalement, je ferais myLabel.text = variable. Cela fonctionne-t-il à Xamarin? Si c'est le cas, pourquoi ce code ne change-t-il pas le texte?

Label_ControlSW.Text = controlSW_Out;
            Label_BLESW.Text = bleSW_Out;
            Label_Mode.Text = mode_Out;

Fichier Xaml

<Label x:Name="Label_ControlSW" Grid.Row="1" Grid.Column="1" HorizontalOptions="Center"  VerticalOptions="Center" FontSize="17" TextColor="White"/>
                <Label x:Name="Label_BLESW" Grid.Row="2" Grid.Column="1" HorizontalOptions="Center"  VerticalOptions="Center" FontSize="17" TextColor="#525252"/>
                <Label x:Name="Label_Mode"  Grid.Row="4" Grid.Column="1" HorizontalOptions="Center"  VerticalOptions="Center" FontSize="17" TextColor="White"/>
3
Bleari

Cela fonctionne-t-il à Xamarin? 

Oui.

Si c'est le cas, pourquoi ce code ne change-t-il pas le texte?

Étant donné que le composant Label n'est pas lié à la variable, il l'obtient simplement lorsque vous n'avez plus Label_ControlSW.Text = controlSW_Out; e.

Pour que cela fonctionne, vous avez essentiellement deux choix:

1. Définissez la valeur sur l'étiquette à chaque modification;

Il n'y a pas de magie ici. Il suffit de définir les valeurs ou les variables telles que ALi Heikal suggère dans sa réponse

2. Liez la page (View) à un objet Observable. La vue écoutera tous les changements apportés à votre objet observable (souvent un modèle de vue) et y réagira (en modifiant sa valeur de texte, par exemple).

Je suppose que ce que vous avez l’intention de faire est le deuxième. Ainsi, vous pouvez créer une propriété complète de chaîne publique sur le code de votre page et relier l'instance de votre page à elle-même. Comme ça:

XAML

<Label Text={Binding MyStringProperty}
       .../>

Code derrière

public partial class MyTestPage : ContentPage
{
    private string myStringProperty;
    public string MyStringProperty
    {
        get { return myStringProperty; }
        set 
        {
            myStringProperty = value;
            OnPropertyChanged(nameof(MyStringProperty)); // Notify that there was a change on this property
        }
    }

    public MyTestPage()
    {
        InitializeComponents();
        BindingContext = this;

        MyTextProperty = "New label text"; // It will be shown at your label
    }
}

Vous devriez jeter un oeil à documents officiels sur les liaisons de données et le modèle MVVM sur XF et si vous débutez avec Xamarin.Forms, je vous recommande vivement de suivre le guide de démarrage officiel qui aborde chaque sujet suffisamment clairement et profondément pour apprendre tout ce dont vous avez besoin.

J'espère que ça aide.

2
Diego Rafael Souza

Essayez d’initialiser la valeur Text en XAML comme suit:

<Label x:Name="YourLableName" Text="Initial Label"/>

Ensuite, accédez-y dans le code derrière comme suit:

YourLableName.Text = "Desired Name";

ou

YourLableName.Text = variable;
2
Ali Heikal

Pour mettre à jour l'interface utilisateur, vous devez être sur le fil de l'interface utilisateur. Vous voudriez faire quelque chose comme:

 Device.BeginInvokeOnMainThread(() =>
 {
     Label_ControlSW.Text = controlSW_Out;
     Label_BLESW.Text     = bleSW_Out;
     Label_Mode.Text      = mode_Out;
 });

Cela résoudra votre problème, mais comme d’autres l'ont indiqué dans leurs réponses, la méthode Xamarin consiste à utiliser data binding pour mettre à jour l'affichage. La liaison de données gérera la mise à jour de l'interface utilisateur pour vous.

0
Andrew

Il y avait quelques raisons pour lesquelles cela n'a pas fonctionné. J'ai changé pour l'approche MVVM. Cela n’avait toujours aucun effet, mais c’était une meilleure approche, comme cela avait été suggéré. Lors du débogage, j'ai remarqué cette ligne: I/Choreographer (16942): 31 images ignorées! L'application effectue peut-être trop de travail sur son thread principal. C'était parce que je faisais trop sur le fil principal (connexions ble) et que je sautais juste le changement d'interface utilisateur. J'ai dû restructurer mon code pour effectuer davantage de tâches sur différents threads. Merci à tous pour l'aide.

0
Bleari

J'ai fait face au même problème. Essayez de nettoyer et construire votre projet après que vous fassiez référence x: Name dans votre dossier de vues. Ou vous pouvez faire Data binding . En utilisant ce code

 <Label Text="{Binding MyProperty}" />

dans Xaml . Et dans ViewModel class 

public class MyViewModel
{
    public string MyProperty { get; set; } = "My Label Text";
}

Et dans le code derrière, il suffit de mentionner le ViewModel votre utilisation 

this.BindingContext = new MyViewModel();

C'est la bonne approche. Essayez donc d’utiliser l’approcheMVVMdans votre avenir de codage car c’est la bonne approche.

0
Judson Abraham