c# xaml windows-phone-8.1 datatemplate flipview

c# - Acceda al control xaml dentro del ítem en flipview



windows-phone-8.1 datatemplate (1)

Necesita un método VisualTreeHelper. Este es solo un código que estoy usando. Creo que puedes ajustarlo fácilmente a tus necesidades.

Primero, coloque el método FindElementByName en algún lugar de su código detrás del archivo:

public T FindElementByName<T>(DependencyObject element, string sChildName) where T : FrameworkElement { T childElement = null; var nChildCount = VisualTreeHelper.GetChildrenCount(element); for (int i = 0; i < nChildCount; i++) { FrameworkElement child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; if (child == null) continue; if (child is T && child.Name.Equals(sChildName)) { childElement = (T)child; break; } childElement = FindElementByName<T>(child, sChildName); if (childElement != null) break; } return childElement; }

Ahora puede comenzar a usar el método:

this.UpdateLayout(); var fvItem = this.ArticleDetail.Items[ArticleDetail.SelectedIndex]; var container = this.ArticleDetail.ContainerFromItem(fvItem); // NPE safety, deny first if (container == null) return; var tbFeedURL = FindElementByName<TextBlock>(container, "FeedUrl"); // And again deny if we got null if (tbFeedURL == null) return; /* Start doing your stuff here. */

Tengo un flipview que está poblado por algún código (no entiendo cómo modificar una aplicación).

<FlipView x:Name="ArticleDetail" Grid.Row="1" AutomationProperties.AutomationId="ItemsFlipView" AutomationProperties.Name="Item Details" TabIndex="1" DataContext="{Binding LatestArticlesModel}" ItemsSource="{Binding Items}" ItemTemplate="{StaticResource LatestArticles1DetailDetail}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" ItemContainerStyle="{StaticResource FlipItemStyle}"> </FlipView> <!--Data template for flipview--> <DataTemplate x:Key="LatestArticles1DetailDetail"> <ScrollViewer> <StackPanel> <TextBlock Margin="0,16" Text="{Binding Title, Converter={StaticResource TextPlainConverter}, ConverterParameter = 140}" Style="{StaticResource SubHeaderText}" /> <Image Source="{Binding ImageUrl, Converter={StaticResource ThumbnailConverter}, ConverterParameter=300}" Stretch="UniformToFill" /> <TextBlock x:Name="FeedUrl" Margin="0,12" Style="{StaticResource Html2XamlStyleText}" Text="{Binding FeedUrl}" Visibility="Collapsed"/> <RichTextBlock x:Name="Content" Margin="0,12" Style="{StaticResource Html2XamlStyle}"/> </StackPanel> </ScrollViewer> </DataTemplate>

Del bloque de texto llamado "FeedUrl" quiero extraer la url que está almacenada en él.

Use la url para analizar la página html señalada por esa url

Después del procesamiento, muestra un contenido en richtextblock llamado "contenido".

El único problema al que me enfrento es cómo obtener una referencia al bloque de texto y al bloque de texto enriquecido dentro de cada elemento de la vista flipview.

Para obtener referencias a los artículos, he intentado con dos soluciones:

  1. He intentado este código, pero la línea

var myTextBlock= _Children.OfType<TextBlock>().FirstOrDefault(c => c.Name.Equals("test")); específicamente

.OfType<TextBlock>() da un error

''System.Collections.Generic.List<Windows.UI.Xaml.Controls.TextBlock>'' does not contain a definition for ''OfType'' and no extension method ''OfType'' accepting a first argument of type ''System.Collections.Generic.List<Windows.UI.Xaml.Controls.TextBlock>'' could be found (are you missing a using directive or an assembly reference?)

  1. También probé otra solución dada aquí , pero siempre obtengo una referencia nula.

También recibo una advertencia para la línea

var item = itemsControl.ItemContainerGenerator.ContainerFromItem(o); Windows.UI.Xaml.Controls.ItemContainerGenerator.ContainerFromItem(o); is obsolote.''ContainerForm'' may be unavailable for releases after Windows Phone 8.1. Use itemsControl.ContainerFromItem instead.

Incluso si uso itemsControl.ContainerFromItem siempre devuelve una referencia nula.

Por favor ayuda

ACTUALIZAR:

Estoy usando lo siguiente

if(!statusiop.statusup){ this.UpdateLayout(); for (int i = 0; i < ArticleDetail.Items.Count; i++) { var fvItem = this.ArticleDetail.Items[i]; var container = this.ArticleDetail.ContainerFromItem(fvItem); if (container == null) { Text = "null container"; } else { var tbFeedURL = FindElementByName<TextBlock>(container, "FeedUrl"); if (tbFeedURL == null) { test.Text = "null text"; } else { tbFeedURL.Text = tbFeedURL.Text + "Test"; } } }

Repito todos los elementos en la vista alternativa y modifico los datos según sea necesario. También estoy usando una clase pública estática

public static class statusiop { public static Boolean statusup= false; }

que contiene un statusup de miembro. statusup sirve como un indicador que, cuando es verdadero, indica que los datos de la revisión se han actualizado una vez y no es necesario actualizarlos nuevamente.