2016-10-10 1 views
0

Ich habe eine Xamarin.Forms PCL VS2015-Lösung und habe drei Tage lang nach einer Lösung gesucht mein Problem. Ich habe viele Möglichkeiten versucht, einschließlich der Listview onitemselected, die für Win10 funktioniert, aber nicht für Android oder iOS. Versucht this.FindByName (emailValue); und mit dem Sender Frame auch, aber kein Glück. Ich muss die E-Mail-Adresse angeben, die den Label-Text bindet.Wie bekomme ich den Textwert eines Etiketts, das ein Kind eines Stacklayouts ist, das ein Kind eines Frames in einem Listenansichtselement ist

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

Das Label ist ein Kind eines Kindes eines Listview-Elements.

Das x: Name-Element ist im Code dahinter nicht verfügbar. Ich verstehe das, weil das Label in einer Listview ist und der Compiler nicht in der Lage sein würde, zwischen den Listview-Elementen zu unterscheiden.

Ich habe mit Intellisense, auf dem Absender des Tap (der Rahmen) gebohrt, und ich kann den E-Mail-Text sehen, den ich brauche, aber ich kann einen Weg herausfinden, es zu extrahieren.

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

!

Antwort

0

Nach dem Stellen der Frage sortierte ich aus, wie man den Text, den ich verlangte, benutzte, den drill down intellisense für hinunter auf das erforderliche Niveau hinunterzugehen.

Erste Ebene ist der Rahmen. Zweite Ebene ist das Stacklayout und das erforderliche Label ist dritte Ebene.

Ich benutze dann Plugin.Messanger, um die E-Mail zu senden.

Beachten Sie, dass dies auch für die Verwendung des Telefonwählgeräts und das Extrahieren der anzurufenden Telefonnummer funktioniert.

Hier ist meine Lösung: Beachten Sie die listChildren [1] ist der Index der Kind-Label, die ich benötige.

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"); 
     } 
    } 
0

die Informationen, die Sie gefunden, war ich auch in der Lage, die TapGesture auf die spezifische Etikett zu verengen ich brauchte, die das Stück vereinfacht die ich brauchte. Hier

ist die XAML

<Label 
    Text="{Binding MapUri}" 
    TextColor="#ab1e2c" 
    FontAttributes="Bold" 
    HorizontalTextAlignment="End"> 
    <Label.GestureRecognizers> 
     <TapGestureRecognizer 
      Tapped="OnLabelTapped" 
      NumberOfTapsRequired="1" /> 
    </Label.GestureRecognizers> 
</Label> 

Hier ist die 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)); 
    } 
} 
+0

Wenn Sie eine neue Frage haben, bitte fragen Sie, indem Sie auf die [Frage stellen] (https://stackoverflow.com/Fragen/Fragen). Fügen Sie einen Link zu dieser Frage hinzu, wenn es hilft, Kontext bereitzustellen. - [Aus Bewertung] (/ review/low-quality-posts/19027320) –

Verwandte Themen