如何获取标签的文本值,该标签是 stacklayout 的子级,而 stacklayout 是 listview 项目内 Frame 的子级
How can I get the text value of a label that is a child of a stacklayout which is a child of a Frame inside a listview item
我有一个 Xamarin.Forms PCL VS2015 解决方案,我花了三天时间寻找问题的解决方案。我尝试了多种方法,包括使用 Listview onitemselected,它适用于 Win10 但不适用于 Android 或 iOS。试过 this.FindByName(emailValue);并使用发件人框架也没有运气。我需要提供作为标签文本绑定的电子邮件地址。
<Label x:Name="emailValue"
Text="{Binding Email}"/>
该标签是列表视图项的子项的子项。
x:Name 元素在后面的代码中不可用。我知道这是因为标签在列表视图中,编译器无法区分列表视图项。
我已经使用 intellisense 在点击(框架)的发件人上进行了深入研究,我可以看到我需要的电子邮件文本,但我无法找到提取它的方法。
<StackLayout Orientation="Vertical"
VerticalOptions="FillAndExpand">
<ListView x:Name="listViewContacts"
ItemSelected="OnListViewItemSelected"
IsPullToRefreshEnabled="true" Refreshing="OnRefresh"
SeparatorColor="#FFCF00"
VerticalOptions="FillAndExpand"
HasUnevenRows="True">
<!-- Need HasUnevenRows = true to enable correct
display in Android-->
<ListView.ItemTemplate>
<DataTemplate >
<ViewCell>
<ContentView Padding="5">
<StackLayout>
<Grid RowSpacing="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Frame OutlineColor="Black"
BackgroundColor="Transparent"
Padding="0"
Grid.Row="4">
<Frame.GestureRecognizers>
<TapGestureRecognizer Tapped="OnPhoneFrameTapped"/>
</Frame.GestureRecognizers>
<StackLayout Orientation="Horizontal"
Padding="10,5,0,5">
<Label Text="Phone:"/>
<Label x:Name="phoneValue"
Text="{Binding Mobile}"/>
</StackLayout>
</Frame> ...
!
发布问题后,我整理了如何使用向下钻取智能感知获取我需要的文本以降级到所需级别。
第一层是框架。第二层是Stacklayout,需要的Label是第三层。
然后我使用 Plugin.Messanger 发送电子邮件。
请注意,这也适用于使用 phone 拨号器并提取要呼叫的 phone 号码。
这是我的解决方案:注意 listChildren[1] 是我需要的子标签的索引。
void OnEmailFrameTapped(object sender, EventArgs args)
{
Frame f = (Frame)sender;
string emailstring = string.Empty;
var fcontent = f.Content;
var myStacklayout = fcontent.GetType();
if (myStacklayout == typeof (StackLayout))
{
StackLayout fStacklayout = (StackLayout)fcontent;
var listChildren = fStacklayout.Children;
var reqLabel = listChildren[1];
var theLabel = reqLabel.GetType();
if (theLabel == typeof(Label))
{
Label emailLabel = (Label)reqLabel;
emailstring = emailLabel.Text;
}
}
var emailMessenger = CrossMessaging.Current.EmailMessenger;
if (emailMessenger.CanSendEmail)
{
// Send simple e-mail to single receiver without attachments, bcc, cc etc.
emailMessenger.SendEmail(emailstring,
"Test Sender",
"Hello from message");
}
}
使用您找到的信息,我还能够将 TapGesture 缩小到我需要的特定标签,从而简化了我需要的部分。
这是xaml
<Label
Text="{Binding MapUri}"
TextColor="#ab1e2c"
FontAttributes="Bold"
HorizontalTextAlignment="End">
<Label.GestureRecognizers>
<TapGestureRecognizer
Tapped="OnLabelTapped"
NumberOfTapsRequired="1" />
</Label.GestureRecognizers>
</Label>
这是.cs
public async void OnLabelTapped(object sender, EventArgs args)
{
string mapUri = string.Empty;
Label l = (Label)sender;
mapUri = l.mapUri;
var result = await Application.Current.MainPage.DisplayAlert("Alert", "Launch Google Maps" , "OK", "Cancel");
if (result)
{
Device.OpenUri(new Uri(mapUri));
}
}
我有一个 Xamarin.Forms PCL VS2015 解决方案,我花了三天时间寻找问题的解决方案。我尝试了多种方法,包括使用 Listview onitemselected,它适用于 Win10 但不适用于 Android 或 iOS。试过 this.FindByName(emailValue);并使用发件人框架也没有运气。我需要提供作为标签文本绑定的电子邮件地址。
<Label x:Name="emailValue"
Text="{Binding Email}"/>
该标签是列表视图项的子项的子项。
x:Name 元素在后面的代码中不可用。我知道这是因为标签在列表视图中,编译器无法区分列表视图项。
我已经使用 intellisense 在点击(框架)的发件人上进行了深入研究,我可以看到我需要的电子邮件文本,但我无法找到提取它的方法。
<StackLayout Orientation="Vertical"
VerticalOptions="FillAndExpand">
<ListView x:Name="listViewContacts"
ItemSelected="OnListViewItemSelected"
IsPullToRefreshEnabled="true" Refreshing="OnRefresh"
SeparatorColor="#FFCF00"
VerticalOptions="FillAndExpand"
HasUnevenRows="True">
<!-- Need HasUnevenRows = true to enable correct
display in Android-->
<ListView.ItemTemplate>
<DataTemplate >
<ViewCell>
<ContentView Padding="5">
<StackLayout>
<Grid RowSpacing="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Frame OutlineColor="Black"
BackgroundColor="Transparent"
Padding="0"
Grid.Row="4">
<Frame.GestureRecognizers>
<TapGestureRecognizer Tapped="OnPhoneFrameTapped"/>
</Frame.GestureRecognizers>
<StackLayout Orientation="Horizontal"
Padding="10,5,0,5">
<Label Text="Phone:"/>
<Label x:Name="phoneValue"
Text="{Binding Mobile}"/>
</StackLayout>
</Frame> ...
!
发布问题后,我整理了如何使用向下钻取智能感知获取我需要的文本以降级到所需级别。
第一层是框架。第二层是Stacklayout,需要的Label是第三层。
然后我使用 Plugin.Messanger 发送电子邮件。
请注意,这也适用于使用 phone 拨号器并提取要呼叫的 phone 号码。
这是我的解决方案:注意 listChildren[1] 是我需要的子标签的索引。
void OnEmailFrameTapped(object sender, EventArgs args)
{
Frame f = (Frame)sender;
string emailstring = string.Empty;
var fcontent = f.Content;
var myStacklayout = fcontent.GetType();
if (myStacklayout == typeof (StackLayout))
{
StackLayout fStacklayout = (StackLayout)fcontent;
var listChildren = fStacklayout.Children;
var reqLabel = listChildren[1];
var theLabel = reqLabel.GetType();
if (theLabel == typeof(Label))
{
Label emailLabel = (Label)reqLabel;
emailstring = emailLabel.Text;
}
}
var emailMessenger = CrossMessaging.Current.EmailMessenger;
if (emailMessenger.CanSendEmail)
{
// Send simple e-mail to single receiver without attachments, bcc, cc etc.
emailMessenger.SendEmail(emailstring,
"Test Sender",
"Hello from message");
}
}
使用您找到的信息,我还能够将 TapGesture 缩小到我需要的特定标签,从而简化了我需要的部分。
这是xaml
<Label
Text="{Binding MapUri}"
TextColor="#ab1e2c"
FontAttributes="Bold"
HorizontalTextAlignment="End">
<Label.GestureRecognizers>
<TapGestureRecognizer
Tapped="OnLabelTapped"
NumberOfTapsRequired="1" />
</Label.GestureRecognizers>
</Label>
这是.cs
public async void OnLabelTapped(object sender, EventArgs args)
{
string mapUri = string.Empty;
Label l = (Label)sender;
mapUri = l.mapUri;
var result = await Application.Current.MainPage.DisplayAlert("Alert", "Launch Google Maps" , "OK", "Cancel");
if (result)
{
Device.OpenUri(new Uri(mapUri));
}
}