wake-up-neo.com

So ändern Sie den Beschriftungstext in Xamarin

Ich bin relativ neu in Xamarin-Formen. Ich habe herausgefunden, dass ich den Etikettentext nicht ändern kann. Normalerweise würde ich myLabel.text = variable tun. Funktioniert das in Xamarin? Wenn dies der Fall ist, ändert dieser Code den Text nicht?

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

Xaml-Datei

<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

Funktioniert das in Xamarin? 

Ja tut es.

Wenn dies der Fall ist, ändert dieser Code den Text nicht?

Da die Label-Komponente nicht an die Variable gebunden ist, erhält sie ihren Wert, wenn Sie Label_ControlSW.Text = controlSW_Out; nicht mehr getan haben.

Damit es funktioniert, haben Sie grundsätzlich zwei Möglichkeiten:

1. Setzen Sie den Wert bei jeder Änderung auf das Label.

Hier gibt es keine Magie. Setzen Sie einfach die Werte oder Variablen wie ALi Heikal schlägt in seiner Antwort vor

2. Binden Sie die Seite (View) an ein Observable-Objekt, dann hört die View jede Änderung an Ihrem Observable-Objekt (häufig ein View Model) an und reagiert darauf (beispielsweise durch Ändern des eigenen Textwerts).

Ich denke, was Sie vorhaben, ist das zweite. Sie können also eine öffentliche Zeichenfolge mit vollem Inhalt hinter dem Code Ihrer Seite erstellen und die Instanz Ihrer Seite an sich binden. So was:

XAML

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

Code hinter

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
    }
}

Sie sollten einen Blick auf offizielle Dokumente zu Datenbindungen und MVVM-Pattern auf XF werfen. Wenn Sie mit Xamarin beginnen. Formulare. Ich empfehle Ihnen dringend, dem Leitfaden für erste Schritte zu folgen. _ das spricht jedes Thema klar und tief genug an, um alles zu lernen, was Sie brauchen.

Ich hoffe, es hilft.

2

Versuchen Sie, den Wert Text in XAML wie folgt zu initialisieren:

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

Greifen Sie dann wie folgt auf den folgenden Code zu:

YourLableName.Text = "Desired Name";

oder

YourLableName.Text = variable;
2
Ali Heikal

Um die Benutzeroberfläche zu aktualisieren, müssen Sie sich im UI-Thread befinden. Sie möchten etwas tun wie:

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

Dies löst Ihr Problem, aber wie die anderen in ihren Antworten angegeben haben, würde Xamarin dies mit Datenbindung tun, um die Ansicht zu aktualisieren. Die Datenbindung übernimmt die Aktualisierung der Benutzeroberfläche für Sie.

0
Andrew

Es gab einige Gründe, warum dies nicht funktionierte. Ich wechselte zum MVVM-Ansatz. Dies hatte immer noch keine Wirkung, war aber, wie vorgeschlagen wurde, ein besserer Ansatz. Beim Debuggen fiel mir folgende Zeile auf: I/Choreographer (16942): 31 Frames übersprungen! Die Anwendung führt möglicherweise zu viel Arbeit in ihrem Haupt-Thread aus. Dies lag daran, dass ich zu viel für den Haupt-Thread (ble-Verbindungen) gemacht habe und die UI-Änderung einfach übersprungen wurde. Ich musste meinen Code umstrukturieren, um auf verschiedenen Threads mehr zu erreichen. Danke für die Hilfe allen.

0
Bleari

Ich stand vor demselben Problem. Versuchen Sie, bereinigen und erstellen Ihr Projekt, nachdem Sie x: Name in Ihrem Ansichtsordner erstellt haben. Oder Sie können DatenBindung machen. Mit diesem Code

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

in Xaml. Und in der Klasse ViewModel 

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

Erwähnen Sie im Code einfach das ViewModel, das Sie verwenden 

this.BindingContext = new MyViewModel();

Dies ist der richtige Ansatz. Versuchen Sie daher, MVVM in Ihrer zukünftigen Codiermethode zu verwenden, da dies der richtige Ansatz ist.

0
Judson Abraham