Xamarin Forms 中条目的水平放置是否存在任何已知问题?

Is there any known issue with horizontal placement of entries in Xamarin Forms?

在我的 Xamarin 应用程序中制作设置页面的布局时,我注意到除非我单击 Entry,否则无法看到 Entries 中的文本。 我做了不同的测试,重新创建了整个结构并得出结论,当两个条目非垂直显示时,就会发生这种情况。 也许我做错了什么而我只是看不到它(可能是因为我在互联网上进行了大量研究但没有找到任何东西),所以这是我重现错误的 XAML 页面。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:vm="clr-namespace:MyApp.ViewModels"
             mc:Ignorable="d"
             x:Class="MyApp.Views.SettingsPage">
    <ContentPage.BindingContext>
        <vm:SettingsViewModel/>
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <StackLayout>
            <Label  Text="User information"
                    FontSize="Large"/>
            <StackLayout Orientation="Horizontal">
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
            </StackLayout>
            <StackLayout Orientation="Vertical">
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
                <Label Text="Name*"/>
                <Entry Text="{Binding Name}"/>
            </StackLayout>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

如你所见,两个StackLayouts完全一样,只是第一个Orientation设置为Horizontal,第二个Vertical . 所有 Entries 都将它们的数据绑定设置为相同的 public 属性,这意味着它们中的任何一个的值都应该相同。现在,当我转到我的设置页面时,第一个 StackLayout 显示其中的空条目。 第二个 StackLayout 显示其中包含正确字符串的条目。 如果我单击第一个 StackLayout 内的 Entry 以在其中输入文本,则会显示其内容。 我使用 Grid 尝试了同样的事情,但问题仍然存在。 我在 UWP 上执行此操作,但我不知道这是否也会在 AndroidiOS 上发生。 这有什么已知问题吗?有没有人尝试水平显示条目?因为我找不到任何以正确方式执行此操作的示例,如果有的话。

我也提供了ViewModel的代码,以防万一。

using MyApp.Models;
using Xamarin.Essentials;

namespace MyApp.ViewModels
{
    class SettingsViewModel : BaseViewModel
    {
        public SettingsViewModel()
        {

        }
        public string Name
        {
            get { return Preferences.Get(Consts.PREF_NAME, ""); }
            set
            {
                Preferences.Set(Consts.PREF_NAME, value);
                OnPropertyChanged(nameof(Name));
            }
        }
    }
}

下面的代码对我来说工作正常。我刚刚将您的代码包含在 ScrollView 中。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:vm="clr-namespace:MyApp.ViewModels"
         mc:Ignorable="d"
         x:Class="MyApp.Views.SettingsPage">
    <ContentPage.BindingContext>
        <vm:SettingsViewModel/>
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <ScrollView>
            <StackLayout>
                <Label  Text="User information"
                FontSize="Large"/>
                <StackLayout Orientation="Horizontal">
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                </StackLayout>
                <StackLayout Orientation="Vertical">
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                    <Label Text="Name*"/>
                    <Entry Text="{Binding Name}"/>
                </StackLayout>
            </StackLayout>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>

我在 iOS 和 UWP 端都进行了测试,一切正常。我认为您应该注意将值分配给 SettingsViewModel.Name 的代码。以下是您可以参考的一些代码:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        model m = new model();
        m.Name = "name_1";
        BindingContext = m;
    }
}

class model : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public model()
    {
    }

    public string Name
    {

        get { return Preferences.Get("Consts.PREF_NAME", ""); }
        set
        {
            Preferences.Set("Consts.PREF_NAME", value);
            if (PropertyChanged != null)
               {
                    PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                }           
        }
    }
}

结果: