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
上执行此操作,但我不知道这是否也会在 Android
和 iOS
上发生。
这有什么已知问题吗?有没有人尝试水平显示条目?因为我找不到任何以正确方式执行此操作的示例,如果有的话。
我也提供了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"));
}
}
}
}
结果:
在我的 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
上执行此操作,但我不知道这是否也会在 Android
和 iOS
上发生。
这有什么已知问题吗?有没有人尝试水平显示条目?因为我找不到任何以正确方式执行此操作的示例,如果有的话。
我也提供了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"));
}
}
}
}
结果: