如何在Xamarin中更改标签文本

时间:2018-09-17 11:02:31

标签: c# xaml xamarin xamarin.forms

我对Xamarin表格比较陌生。我发现我无法从后面的代码中更改标签文本。通常我会做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 :(得分:3)

请尝试在XAML中初始化csr值,如下所示:

routes.map(route => route.subroutes).map(subroute => 'do whatever you want with each subroute')

然后像下面这样在后面的代码中对其进行访问:

Text

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

答案 1 :(得分:2)

  

这在Xamarin中起作用吗?

是的。

  

如果可以,为什么此代码不更改文本?

由于Label组件不受该变量的限制,因此仅在执行Label_ControlSW.Text = controlSW_Out;后再获取其值。

要使其正常工作,您基本上有两种选择:

1。在每次更改时将值设置为标签;

这里没有魔术。只需设置值或变量,例如Ali Heikal suggests in his answer

2。将页面(视图)绑定到可观察对象,然后视图将侦听可观察对象(通常是视图模型)上的每处更改并对此做出反应(例如,更改其自身Text值)。

我想您打算做的是第二个。因此,您可以在页面代码后面创建一个公共字符串full属性,并将页面实例绑定到自身。像这样:

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

您应该看一下official docs about data bindings and MVVM pattern on XF,如果您是从Xamarin.Forms开始的,我强烈建议您遵循official getting started guide来处理每个主题,这些主题应该足够清晰,深入,以学习您所需的一切。

希望对您有帮助。

答案 2 :(得分:0)

我遇到了同样的问题。在视图文件夹中创建x:Name引用后,尝试清理并构建项目。或者,您可以执行数据 绑定。通过使用此代码

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

Xaml 中。在 ViewModel

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

在后面的代码中,只需提及您使用的 ViewModel

this.BindingContext = new MyViewModel();

这是正确的方法。因此,在以后的编码中尝试使用 MVVM 方法,因为这是正确的方法。

答案 3 :(得分:0)

为了更新UI,您必须位于UI线程上。您可能想要做类似的事情:

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

这将解决您的问题,但是正如其他人在回答中所述,Xamarin的实现方式将使用data binding来更新视图。数据绑定将为您处理UI更新。

答案 4 :(得分:0)

有几个原因导致它不起作用。我改为使用MVVM方法。这仍然没有效果,但是它是建议的更好方法。调试时,我注意到以下行:I / Choreographer(16942):跳过了31帧!该应用程序可能在其主线程上做太多工作。这是因为我在主线程上做得太多(连接错误),而只是跳过了UI更改。我必须重组代码以在不同线程上执行更多操作。谢谢大家的帮助。