我怎么能得到一个标签的文本值,它是一个堆栈布局的孩子,这是一个框架的孩子在一个列表视图项目

本文关键字:一个 孩子 框架 列表 堆栈布局 项目 视图 文本 怎么能 标签 | 更新日期: 2023-09-27 18:12:16

我有一个Xamarin。表格PCL VS2015解决方案,并花了三天时间寻找解决我的问题的方法。我尝试了许多方法,包括使用Listview onitemselected,它在Win10上工作得很好,但不适用于Android或iOS。尝试this.FindByName (emailValue);也可以使用发送框,但运气不好。我需要提供电子邮件地址,这是标签文本绑定。

<Label x:Name="emailValue"
       Text="{Binding Email}"/>

标签是listview项的子项的子项。

x:Name元素在后面的代码中不可用。我理解这是因为标签在listview中,编译器将无法区分listview项。

我已经使用智能感知向下挖掘,在点击的发送者(框架)上,我可以看到我需要的电子邮件文本,但我无法找到提取它的方法。

    <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> ...

!

我怎么能得到一个标签的文本值,它是一个堆栈布局的孩子,这是一个框架的孩子在一个列表视图项目

在发布问题之后,我整理了如何使用钻取智能感知来获得所需的文本,以达到所需的级别。

第一层是Frame。第二层是Stacklayout,第三层是所需的Label。

然后我使用Plugin。发送邮件的信使。

注意,这也适用于使用电话拨号器并提取要呼叫的电话号码。

下面是我的解决方案:注意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));
    }
}