访问flipview中第i项内的xaml控件

时间:2014-10-07 13:03:31

标签: c# xaml windows-phone-8.1 datatemplate flipview

我有一个由一些代码填充的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页面

处理后,在richtextblock中显示一些名为“content”的内容。

我面临的唯一问题是如何在flipview的每个项目中引用textblock和richtextblock。

为了获得对项目的参考,我尝试了两种解决方案:


  1. 我已经尝试了这个code,但行
  2. 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. 我还尝试了here给出的另一个解决方案,但我总是得到一个空引用。
    2. 我也收到了行

      的警告

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

      我遍历flipview中的所有项目,并根据需要修改数据。我也在使用公共静态类

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

      包含成员状态。 statusup用作标志,当为true时表示flipview数据已更新一次且无需再次更新。

1 个答案:

答案 0 :(得分:2)

您需要一个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.
*/