我有一个由一些代码填充的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。
为了获得对项目的参考,我尝试了两种解决方案:
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?)
我也收到了行
的警告 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数据已更新一次且无需再次更新。
答案 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.
*/