我正在开发一个项目使用Xamarin.Forms,我需要在运行时动态创建输入字段。如何在运行时动态添加输入字段在Xamarin.Forms
例如,将询问用户团队中玩家的数量,并根据用户提供的数据,我需要为每个玩家创建Entry
字段,例如姓名,年龄,联系人等。
我正在开发一个项目使用Xamarin.Forms,我需要在运行时动态创建输入字段。如何在运行时动态添加输入字段在Xamarin.Forms
例如,将询问用户团队中玩家的数量,并根据用户提供的数据,我需要为每个玩家创建Entry
字段,例如姓名,年龄,联系人等。
但是怎么会变成这样帮助我在加入动态,即根据玩家用户输入的号码输入字段?
首先,您可以通过C#动态创建它们,或者添加它们并将它们隐藏在Xaml中。在Xaml的情况下,你可以做的是添加条目并将其可见性设置为false,你不需要创建x个条目,你只是想根据玩家的数量收集数据。
所以首先,只需添加的每个字段的一个条目,你想:现在
<Entry x:Name="NameEntry" IsVisible="false" />
<Entry x:Name="AgeEntry" IsVisible="false" />
,用户提供他的玩家数量之后,首先你把条目在你的xaml.cs可见:
NameEntry.IsVisible = true;
AgeEntry.IsVisible = true;
你可以将你的玩家人数存储在一个变量中,我猜你会有一个按钮来保存数据吗?该按钮每次点击后,你是否保存的数据的数量已经达到了球员的数量和清除的条目,并一度达到你把他们带回是无形的:
NameEntry.Text = string.Empty;
AgeEntry.Text = string.Empty;
numberOfSavedData++;
//your saving logic in your button click
if (numberOfSavedData == numberOfPlayers)
{
NameEntry.IsVisible = false;
AgeEntry.IsVisible = false;
//etc...
}
这不是真正动态地创建他们,这只是为了隐藏/显示条目。现在如果你想创建它们,然后再删除它们,你也可以在你的xaml.cs中完成。建议将在您的xaml中创建堆栈布局以将条目添加到它。
<StackLayout x:Name="EntriesStackLayout">
</StackLayout>
在你xaml.cs,已经提供的球员号码后,您可以添加你需要什么数据仅有1项,如:
Entry nameEntry = new Entry();
Entry ageEntry = new Entry();
EntriesStackLayout.Children.Add(nameEntry);
EntriesStackLayout.Children.Add(ageEntry);
而且如前所述,你会的当然有一个按钮来保存数据,你可以做同样的处理程序里面一样:
nameEntry.Text = string.Empty;
ageEntry.Text = string.Empty;
numberOfSavedData++;
//click handler
if (numberOfSavedData == numberOfPlayers)
{
EntriesStackLayout.Children.Remove(nameEntry);
EntriesStackLayout.Children.Remove(ageEntry);
//etc...
}
在你xaml.cs,你可以做到这一点
for(var i = 0; i < 10; i++)
{
Panel.Children.Add(new Entry());
}
在XAML中,您有类似
<StackLayout x:Name=Panel/>
一个更好的解决办法是用XAML创建一个内容查看(即PlayerTemplate ),那么,你可以做
for(var i = 0; i < 10; i++)
{
Panel.Children.Add(new PlayerTemplate());
}
编辑:若y OU要存储数据,你可以做以下
在你的ViewModel类,你必须:
public IEnumerable<PlayerViewModel> Players {get; set;}
当然,您的视图模型应该执行INotifyPropertyChanged,当你设定Players
你应该引发事件物业
然后,在你看来,你可以这样做:
foreach(var player in myViewModel.Players)
{
Panel.Children.Add(new PlayerTemplate{ BindingContext = player });
}
的绑定将更新每个玩家。
for (int x = 1; x < NumOfPlayers; x++) {
AddEntry(myLayout, "Player " + x.ToString());
}
private void AddEntry(StackLayout sl, string name) {
Label label = new Label() { Text = name };
Entry entry = new Entry() { Placeholder = name };
sl.Children.Add(label);
sl.Children.Add(entry);
}
但是,这将如何帮助我动态添加输入字段**,即基于用户输入的玩家数量? @Jason –
使用循环为所需数量的玩家调用AddEntry()方法 - 请参阅我的编辑 – Jason
好question..quick解决方案:你可以把浏览所有条目,使该视图中可见=假,当用户选择一个号码你会让visible = true ,并且出现的条目将被循环使用。 –