我想显示列表中的数据以及电子邮件。我需要副总裁,我希望分别打开他们的电子邮件链接,以打开外部电子邮件平台。但是,代码似乎无法正常工作,它只为副总裁打开一封电子邮件,而包含它的整个标签似乎对它做出了反应。
这是它的屏幕截图。
我的Xmal代码
<Label Text="Vice-President:" FontSize="18" FontAttributes="Bold" XAlign="Center" TextColor="Black"/>
<StackLayout x:Name="vpDetails">
</StackLayout>
我的C#代码
foreach (var item in leaderDetail)
{
Boolean IsPresident = item.IsPresident;
if (IsPresident == true)
{
lbPresidentName.Text = item.Name;
btnPresidentEmail.Text = item.Email;
var tgrPresident = new TapGestureRecognizer();
tgrPresident.Tapped += (s, e) => Device.OpenUri(new Uri("mailto:" + item.Email));
btnPresidentEmail.GestureRecognizers.Add(tgrPresident);
}
else
{
vpDetails.Children.Add(new Label { Text = item.Name ,FontSize=14, HorizontalOptions = LayoutOptions.Center});
vpDetails.Children.Add(new Label { Text = item.Email, FontSize=14, HorizontalOptions = LayoutOptions.Center, x:name="lbvPresident1Email"});
//lbvPresident1Name.Text = item.Name;
//lbvPresident1Email.Text = item.Email;
var tgrVPEmail = new TapGestureRecognizer();
tgrVPEmail.Tapped += (s, e) => Device.OpenUri(new Uri("mailto:" + item.Email));
lbvPresident1Email.GestureRecognizers.Add(tgrVPEmail);
}
}
答案 0 :(得分:1)
这是因为对于多个副总裁而言,您只是将文本附加到一个标签上。这意味着您首先添加一个副总裁,并将他的Gesture识别器添加到他的电子邮件中,并为另一个添加文本并注册另一个手势识别器。然后,第一个识别出轻击手势。
基本上,在整个代码运行之后会发生的事情是标签lbvPresident1Name
包含所有副名称和电子邮件,并且有多个GestureRecognizers(每个副预设一个)。
要解决此问题,您应该创建一个副总裁名单,并将每个副总裁添加为项目或添加容器,并为其中的每个副本创建标签。
要在Xamarin.Forms中创建ListView,请参阅文档 - https://developer.xamarin.com/samples/xamarin-forms/WorkingWithListview/
要创建一个可以从代码中动态添加项目的容器,StackLayout
组件将是您方案中的最佳选择。您只需用StackLayout
代替当前标签,然后在foreach循环中创建标签,并使用Children.Add
方法将它们放入StackLayout。
答案 1 :(得分:0)
要解决此问题,您必须使用StackLayout作为容器。创建一个Label的var并添加到foreach循环中。
DetailedClub.xaml
<StackLayout x:Name="vpDetails"></StackLayout>
DetailedClub.xaml.cs
foreach (var item in leaderDetail)
{
//Create a new label for the Email
var VpEmail = new Label { Text = item.Email, FontSize = 14, HorizontalOptions = LayoutOptions.Center };
vpDetails.Children.Add(new Label { Text = item.Name ,FontSize=14, HorizontalOptions = LayoutOptions.Center});
vpDetails.Children.Add(VpEmail);
var tgrVPEmail = new TapGestureRecognizer();
tgrVPEmail.Tapped += (s, e) => Device.OpenUri(new Uri("mailto:" + item.Email));
VpEmail.GestureRecognizers.Add(tgrVPEmail);
}