我想访问C#代码中的“image”元素。我知道我无法直接访问它,因为它在datatemplate中。我尝试过可视树,但仍无法在代码中获得“图像”控制元素。
<FlipView
x:Name="flipView"
AutomationProperties.AutomationId="ItemsFlipView"
AutomationProperties.Name="Item Details"
TabIndex="1"
Grid.RowSpan="2"
ItemsSource="{Binding Source={StaticResource itemsViewSource}}" SelectionChanged="flipView_SelectionChanged">
<FlipView.ItemContainerStyle>
<Style TargetType="FlipViewItem">
<Setter Property="Margin" Value="0,137,0,0"/>
</Style>
</FlipView.ItemContainerStyle>
<FlipView.ItemTemplate>
<DataTemplate>
<!--
UserControl chosen as the templated item because it supports visual state management
Loaded/unloaded events explicitly subscribe to view state updates from the page
-->
<UserControl Loaded="StartLayoutUpdates" Unloaded="StopLayoutUpdates">
<ScrollViewer x:Name="scrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" Grid.Row="1">
<!-- Content is allowed to flow across as many columns as needed -->
<common:RichTextColumns x:Name="richTextColumns" Margin="117,0,117,47">
<RichTextBlock x:Name="richTextBlock" Width="560" Style="{StaticResource ItemRichTextStyle}" IsTextSelectionEnabled="False">
<Paragraph>
<Run FontSize="26.667" FontWeight="Light" Text="{Binding Title}"/>
<LineBreak/>
<LineBreak/>
<Run FontWeight="Normal" Text="{Binding Subtitle}"/>
</Paragraph>
<Paragraph LineStackingStrategy="MaxHeight">
<InlineUIContainer>
<Image x:Name="image" MaxHeight="480" Margin="0,20,0,10" Stretch="Uniform" Source="{Binding Image}" AutomationProperties.Name="{Binding Title}"/>
</InlineUIContainer>
</Paragraph>
</RichTextBlock>
</common:RichTextColumns>
</ScrollViewer>
</UserControl>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
答案 0 :(得分:3)
我已经尝试过,我可以像你所描述的那样访问FlipView DataTemplate内部的控件。尝试以下方法,让我知道这是否有帮助。
public static IEnumerable<T> RecurseChildren<T>(DependencyObject root) where T : UIElement
{
if (root is T)
{
yield return root as T;
}
if (root != null)
{
var count = VisualTreeHelper.GetChildrenCount(root);
for (var idx = 0; idx < count; idx++)
{
foreach (var child in RecurseChildren<T>(VisualTreeHelper.GetChild(root, idx)))
{
yield return child;
}
}
}
}
访问图像控件:
var imageControl = RecurseChildren<Image>(rootVisual).FirstOrDefault();
这里的rootVisual是我页面中的Grid实例。
答案 1 :(得分:2)
在这里回答https://stackoverflow.com/a/16446670/265706
简短的回答是:您遇到的问题是DataTemplate正在重复,而FlipView正在生成内容。名称未公开,因为它会与之前生成的兄弟(或下一个兄弟)产生冲突。
因此,要在DataTemplate中获取命名元素,您必须首先获取生成的项目,然后在该生成的项目内搜索所需的元素。请记住,XAML中的逻辑树是您按名称访问事物的方式。生成的项目不在逻辑树中。相反,它们位于Visual Tree中(所有控件都在Visual Tree中)。这意味着它必须在Visual Tree中搜索您要引用的控件。 VisualTreeHelper允许您执行此操作。