Как изменить текст метки в xamarin - PullRequest
0 голосов
/ 17 сентября 2018

Я относительно новичок в формах ксамарина.Я обнаружил, что не могу изменить текст метки из кода позади.Обычно я бы сделал myLabel.text = variable.Это работает в Xamarin?Если да, почему этот код не меняет текст?

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

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"/>

Ответы [ 5 ]

0 голосов
/ 19 сентября 2018

Было несколько причин, почему это не сработало.Я перешел на подход MVVM.Это все еще не имело никакого эффекта, но это был лучший подход, как было предложено.При отладке я заметил эту строчку: I / Choreographer (16942): пропущено 31 кадр!Приложение может выполнять слишком много работы в своем основном потоке.Это было потому, что я делал слишком много в основном потоке (бле соединения), а он просто пропускал изменение пользовательского интерфейса.Мне пришлось реструктурировать мой код, чтобы выполнять больше на разных потоках.Спасибо всем за помощь.

0 голосов
/ 17 сентября 2018

Чтобы обновить пользовательский интерфейс, вы должны быть в потоке пользовательского интерфейса. Вы хотели бы сделать что-то вроде:

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

Это решит вашу проблему, но, как другие заявили в своих ответах, для этого Xamarin будет использовать привязку данных для обновления представления. Привязка данных будет обрабатывать обновление пользовательского интерфейса.

0 голосов
/ 17 сентября 2018

Я столкнулся с той же проблемой.Попробуйте очистить и собрать ваш проект после того, как вы сделаете ссылку x: Name в вашей папке просмотра.Или вы можете сделать Data привязки .Используя этот код

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

в Xaml .И в ViewModel class

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

И в коде позади просто упомяните ViewModel ваше использование

this.BindingContext = new MyViewModel();

Это правильный подход.Поэтому постарайтесь использовать подход MVVM в своем будущем кодировании, потому что это правильный подход.

0 голосов
/ 17 сентября 2018

Это работает в Xamarin?

Да, это так.

Если это так, почему этот код не меняет текст?

Поскольку компонент Label не привязан к переменной, он просто получает его значение, когда вы не сделали больше Label_ControlSW.Text = controlSW_Out; e.

Чтобы все заработало, у вас есть два основных варианта:

1. Установите значение для метки при каждом изменении;

Здесь нет магии. Просто установите значения или переменную как Али Хейкал предлагает в своем ответе

2. Свяжите страницу (представление) с наблюдаемым объектом , затем представление будет прослушивать каждое изменение вашего наблюдаемого объекта (часто модели представления) и реагировать на это (например, изменяя свое собственное текстовое значение).

Полагаю, ты собираешься заняться вторым. Таким образом, вы можете создать полное свойство общедоступной строки в коде вашей страницы и привязать экземпляр вашей страницы к себе. Как это:

XAML

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

Код позади

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;

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

Вам следует взглянуть на официальные документы о привязках данных и шаблоне MVVM на XF , и если вы начинаете с Xamarin.Forms, я настоятельно рекомендую вам следовать официальному руководству по началу работы с , которая охватывает каждую тему достаточно ясно и глубоко, чтобы выучить все, что вам нужно.

Надеюсь, это поможет.

0 голосов
/ 17 сентября 2018

Попробуйте инициализировать значение Text в XAML следующим образом:

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

Затем получите доступ к нему в коде, как показано ниже:

YourLableName.Text = "Desired Name";

или

YourLableName.Text = variable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...