Доступ к элементу управления xaml внутри элемента ith в FlipView

У меня есть флип-просмотр, который заполняется каким-то кодом (я не понимаю, как модифицировать приложение).

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

Из текстового блока с именем «FeedUrl» я хочу извлечь URL-адрес, который в нем хранится.

Используйте URL-адрес для анализа html-страницы, на которую указывает этот URL-адрес.

После обработки отобразите некоторый контент в расширенном текстовом блоке с именем «контент».

Единственная проблема, с которой я сталкиваюсь, заключается в том, как получить ссылку на текстовый блок и богатый текстовый блок внутри каждого элемента флип-просмотра.

Для получения ссылки на элементы я пробовал два решения:


  1. Я пробовал этот код, но строка

var myTextBlock= _Children.OfType<TextBlock>().FirstOrDefault(c => c.Name.Equals("test")); конкретно

.OfType<TextBlock>() выдает ошибку

'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. Я также попробовал другое решение, данное здесь, но я всегда получаю нулевую ссылку.

Я также получаю предупреждение о строке

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.

Даже если я использую itemsControl.ContainerFromItem, он всегда возвращает нулевую ссылку.

Пожалуйста помоги


ОБНОВИТЬ:

я использую следующее

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

Я перебираю все элементы во флип-просмотре и изменяю данные по мере необходимости. Я также использую общедоступный статический класс

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

}

который содержит элемент statusup. statusup служит флагом, который, если он равен true, указывает, что данные Flipview были обновлены один раз и не нуждаются в обновлении снова.


person user3263192    schedule 07.10.2014    source источник


Ответы (1)


Вам нужен метод VisualTreeHelper. Это просто код, который я использую. Я думаю, что вы можете легко настроить его под свои нужды.

Сначала поместите метод FindElementByName где-нибудь в свой код за файлом:

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;
    }

Теперь вы можете начать использовать метод:

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.
*/
person Fred    schedule 07.10.2014
comment
var container = this.ArticleDetail.ItemContainerGenerator.ContainerFromItem(fvItem); выдает предупреждение Windows.UI.Xaml.Controls.ItemContainerGenerator.ContainerFromItem(Object); is obsolote.'ContainerForm' may be unavailable for releases after Windows Phone 8.1. Use itemsControl.ContainerFromItem instead. В переменную контейнера возвращается нулевая ссылка. - person user3263192; 07.10.2014
comment
Попробуйте позвонить UpdateLayout()заранее. И заменил устаревшие звонки на актуальные. Скажи мне, работает ли это сейчас. - person Fred; 07.10.2014
comment
Работает частично. Из 10 пунктов во флипвью. Обновляются только два, а остальные нет. Даже я попытался использовать цикл от i=0 до Article.Items.Count-1, а затем использовал var fvItem = this.ArticleDetail.Items[i]; Но даже тогда обновляются только первые два элемента. Кроме того, я не могу перемещаться по элементам в списке в любом случае. - person user3263192; 07.10.2014
comment
Возможно, вы захотите обновить свой вопрос своим кодом. Трудно помочь, когда нет кода для проверки. - person Fred; 07.10.2014
comment
Я обновил вопрос с кодом, пожалуйста, просмотрите его. Проблемы те же, что я упоминал в предыдущем комментарии. - person user3263192; 07.10.2014
comment
Где вы называете этот метод? Действительно ли данные Flipboard загружены полностью? - person Fred; 07.10.2014
comment
Давайте продолжим обсуждение в чате. - person user3263192; 07.10.2014
comment
Работает при вызове функции внутри SelectionChanged EventHandler. Вместо var fvItem = this.ArticleDetail.Items[ArticleDetail.SelectedIndex]; я использовал FlipView ArticleDetailSelectedItem = sender as FlipView; var fvItem = ArticleDetailSelectedItem.SelectedItem; Спасибо за помощь. - person user3263192; 08.10.2014