WinRT XAML在FlipView项目模板中查找控件

时间:2012-08-08 18:17:15

标签: c# xaml windows-8 windows-runtime

所以我有一个翻转视图来显示文章,在这个翻转视图中我有Microsoft Player Framework的媒体播放器。现在我希望能够从代码访问此媒体播放器。

但是,我发现的每一个例子都在WinTT看不到的DataTemplate上使用了FindName。

我试过了

var flipViewItem = this.flipView.ItemContainerGenerator.ContainerFromIndex(flipView.SelectedIndex);

然后使用VisualTreeHelper查找Media Player,但flipViewItem始终为null。

我尝试了数据绑定视频播放器 - 但这会导致翻转视图项目中的所有视频同时播放。

有人可以帮忙吗?

修改

所以这是我正在使用的xaml:

<FlipView
        x:Name="flipView"
        AutomationProperties.AutomationId="ItemsFlipView"
        AutomationProperties.Name="Item Details"
        TabIndex="1"
        Margin="0,127,0,10"
        ItemsSource="{Binding Source={StaticResource itemsViewSource}}" Grid.RowSpan="2">

        <FlipView.ItemTemplate>
            <DataTemplate>
                <UserControl Loaded="StartLayoutUpdates" Unloaded="StopLayoutUpdates">
                    <ScrollViewer x:Name="scrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" Grid.Row="1">

                        <common:RichTextColumns x:Name="richTextColumns" Margin="117,0,117,47">
                            <RichTextBlock x:Name="richTextBlock" Width="560" Style="{StaticResource ItemRichTextStyle}">
                                <Paragraph>
                                    <Run FontSize="26.667" FontWeight="Light" Text="{Binding Title}"/>
                                </Paragraph>
                                <Paragraph LineStackingStrategy="MaxHeight">
                                    <InlineUIContainer>
                                        <Grid Width="560" Height="340" Margin="0,20,0,10">
                                            <Grid.Background>
                                                <ImageBrush ImageSource="{Binding Image}" Stretch="UniformToFill" />
                                            </Grid.Background>
                                            <Image x:Name="OverlayImage" Visibility="{Binding ShowVideo, Converter={StaticResource booleanToVisibilityConverter}}" Source="Assets/play-icon.png"/>
                                            <mmppf:MediaPlayer x:Name="ArticleVideo" Width="560" Height="340" />
                                        </Grid>
                                    </InlineUIContainer>

我尝试过绑定媒体播放器:

<mmppf:MediaPlayer x:Name="ArticleVideo" Source="{Binding VideoPath}" Width="560" Height="340" PosterSource="{Binding Image}" AutoPlay="False" />

但是,当我这样做并将视频设置为自动播放时 - 它们都会自动播放。如果我在控件上手动按play,我会在System.ComponentModel.PropertyChangedEventHandler.Invoke中收到一个空引用异常。媒体播放器在模板外工作正常。

令人困惑的是,我知道我想要的是什么。用于Windows 8的SkyNews应用程序完全符合我的要求(将视频添加到翻转视图项目模板)。我看了一下c:\ ProgramFiles \ WindowsApps,所以看看他们的xaml看起来像是我的几乎一样 - 媒体播放器上没有数据绑定。唯一的区别是他们在usercontrol上有x:ConnectionId,在模板中有包含视频播放器的网格。我不知道x:ConnectionId是做什么的 - 但他们是否有可能使用它来访问代码中的控件?

2 个答案:

答案 0 :(得分:2)

查看http://winrtxamltoolkit.codeplex.com/downloads/get/467926并查看VisualTreeHelperExtensions。

没有直接的方法来查找可视树中的元素。您需要使用VisualTreeHelper.GetChild(flipView,i)方法。不难实现,但Toolkit有一个扩展方法类文件,您可以直接添加到项目中。它提供了一种按类型获取后代或祖先的方法。我认为它符合您所寻找的法案。

答案 1 :(得分:0)

不确定。如果要访问模板中的命名控件,请查看此处http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html