【问题标题】:How to change label text in xamarin如何在 xamarin 中更改标签文本
【发布时间】:2019-02-21 06:59:50
【问题描述】:

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

【问题讨论】:

  • textColor 和背景颜色一样吗?
  • 不,它们是不同的颜色
  • 你试过调试变量中是否存在值
  • 值在那里,标签文本也显示已更改为变量。画面没有变化。
  • 您是否在处理 UI/主线程上的大事时这样做?如果是这样,您可能需要等待它完成,然后 UI 会更新。

标签: c# xaml xamarin xamarin.forms


【解决方案1】:

这在 Xamarin 中有效吗?

是的,确实如此。

如果是这样,为什么这段代码不改变文本?

因为Label 组件没有绑定到变量,所以它只会在您执行Label_ControlSW.Text = controlSW_Out; 时获取它的值,并且不会更进一步。

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

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

这里没有魔法。只需像Ali Heikal's answer 建议的那样设置值或变量,但您必须每次都手动设置。

2。将页面(视图)绑定到 Observable 对象(模型),然后视图将监听模型上的每个更改并对此做出反应(例如更改它自己的 Text 值)。

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

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】:

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

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

    然后在后面的代码中访问它,如下所示:

    YourLableName.Text = "Desired Name";
    

    YourLableName.Text = variable;
    

    【讨论】:

    • 标签只显示“初始标签”而不是变量
    【解决方案3】:

    为了更新 UI,您必须在 UI 线程上。你会想做这样的事情:

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

    这将解决您的问题,但正如其他人在他们的回答中所述,Xamarin 执行此操作的方法是使用 data binding 更新视图。数据绑定将为您处理 UI 更新。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。在您的视图文件夹中创建 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 方法,因为这是正确的方法。

      【讨论】:

      • 对不起,什么是视图文件夹?
      • 查看文件夹是xaml文件。因此,每当您在 Xaml 中创建任何引用时,您都需要构建它,以便可以在 Xaml.cs 文件中使用引用。
      • 在您的代码中,如果您必须在需要构建它的代码中访问它,则参考是 x:Name="Label_ControlSW"。
      • 不确定我理解你的意思,我在代码中设置了标签文本然后构建它,没有错误。我应该以不同的方式设置它吗?我也尝试过使用 MVVM 方法,但我不确定如何将标签文本设置为我需要的 mainpage.xaml.cs,每两秒更新一次。
      • 如果你打算推荐 MVVM,你可能想展示一个工作示例。您还需要在 ViewModel 中实现INotifyPropertyChanged。我很欣赏它增加了复杂性,但没有它就行不通。
      【解决方案5】:

      这不起作用有几个原因。我改用 MVVM 方法。这仍然没有效果,但正如建议的那样,这是一种更好的方法。调试时我注意到这一行: I/Choreographer(16942): Skipped 31 frames!应用程序可能在其主线程上做了太多工作。这是因为我在主线程(ble 连接)上做的太多,它只是跳过了 UI 更改。我不得不重组我的代码以在不同的线程上执行更多。谢谢大家的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多