XAML 如何以编程方式更改.NET Maui应用程序中标签的Text属性?

nnt7mjpx  于 2023-08-01  发布在  .NET
关注(0)|答案(3)|浏览(162)

我最初在MainPage.xaml文件中设置了一个标签,如下所示:

<Label x:Name="Ans"
       Text=""
       FontSize="18"
       FontFamily="Verdana"
       FontAttributes="Bold"
       TextColor="White"
       Grid.Column="1"
       Grid.Row="2" 
       Padding="20,20,0,0"/>

字符串
我希望在运行时将Text属性更改为一个值。
我在一堂课上试着写了这样的东西:

string retVal;
retVal = "This is a test";
Ans.Text = retVal;


但我收到一条信息说:
“名称'Ans'在当前上下文中不存在。”
我该怎么解决这个问题?

fcy6dtqo

fcy6dtqo1#

您只能通过属于同一XAML页面/视图的代码隐藏中的x:Name访问标签,在您的情况下,这将是 MainPage.xaml.cs,例如:

public partial class MainPage : ContentPage
{
    public void ChangeLabel()
    {
        Ans.Text = "This is a test";
    }
}

字符串
不能通过x:Name属性从其他类访问View元素。XAML文件与其代码隐藏属于同一个类,这就是为什么代码隐藏类被标记为partial
更常见的方法是使用MVVM pattern and data binding,而不是直接设置Text属性。
如果您需要基于不属于View或ViewModel的内容更新UI,例如:一个不同的、不相关的View或ViewModel,那么你也可以use the WeakReferenceManager to subscribe to messages并相应地更新UI。

wswtfjt7

wswtfjt72#

using Microsoft.Maui.Controls;

// ...

// Inside a method or event handler
string retVal = "This is a test";
Label ansLabel = (Label)FindByName("Ans");
ansLabel.Text = retVal;

字符串
使用FindByName方法,可以在当前XAML页中查找命名控件。
希望是帮助

evrscar2

evrscar23#

也许你的标签在CollectionView里面!.
我以前也遇到过同样的问题,是一个“CollectionView”问题。让我解释一下,不仅仅是Label,而是CollectionView中的任何元素,它的x:name=“whatever”在代码隐藏中都是未知的。知道你应该考虑也许其他类型的UI集合也有同样的效果,它的内部元素,idk。
我已经测试了所有这些,创建了一个新的ContentPage,并用下面的代码替换它的xaml(不要忘记编辑名称空间)。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="someNamespace.TestPage"
         Title="TestPage">
<VerticalStackLayout>        
    <CollectionView>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Label x:Name="LabelInsideCollectionView"
                       Text="Welcome to .NET MAUI!"
                       VerticalOptions="Center"
                       HorizontalOptions="Center" />
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
    
    <Label x:Name="LabelOutsideCollectionView"
           Text="Welcome to .NET MAUI!"
           VerticalOptions="Center"
           HorizontalOptions="Center" />
    
</VerticalStackLayout>
</ContentPage>

字符串
这是代码。

namespace someNamespace;
public partial class TestPage : ContentPage
    {
        public TestPage()
        {
            InitializeComponent();

            // This work.
            LabelOutsideCollectionView.Text = "Test";

            // this will not work, Error CS0103  The name 
           //'LabelInsideCollectionView' does not exist in the current context
            LabelInsideCollectionView.Text = "Test"; 
        }
    }


您将看到您的代码隐藏可以读取“LabelOutsideCollectionView”,但不能读取“LabelInsideCollectionView”。
我希望它能帮助你或其他人,并希望MAUI团队可以解决这一切。
以下是截至本答案发布时我的计算机上已安装的版本列表。

Installed Workload Id      Manifest Version       Installation Source
---------------------------------------------------------------------
android                    33.0.68/7.0.100        VS 17.7.33906.173
maui-android               7.0.92/7.0.100         VS 17.7.33906.173
maui-windows               7.0.92/7.0.100         VS 17.7.33906.173
maui-maccatalyst           7.0.92/7.0.100         VS 17.7.33906.173
maccatalyst                16.4.7089/7.0.100      VS 17.7.33906.173
maui-ios                   7.0.92/7.0.100         VS 17.7.33906.173
ios                        16.4.7089/7.0.100      VS 17.7.33906.173


我刚刚向Github上的.NET MAUI仓库报告了一个问题。https://github.com/dotnet/maui/issues/16182

相关问题