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

4

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

然而,我找到的每个示例都在DataTemplate上使用FindName函数,这在WinRT中似乎不存在。

我尝试过:

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

然后使用VisualTreeHelper查找媒体播放器,但flipViewItem始终为空。

我尝试对视频播放器进行数据绑定,但这会导致翻转视图中所有视频同时播放。

有人能帮忙吗?

编辑

这是我使用的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" />

然而,当我这样做并将视频设置为自动播放时,它们都会自动播放。如果我手动按下控件上的播放按钮,我会收到一个空引用异常:System.ComponentModel.PropertyChangedEventHandler.Invoke。媒体播放器在模板外的情况下运行良好。
令人困惑的是,我知道我想要的是可能的。Windows 8的SkyNews应用程序完全符合我的要求(向翻转视图项目模板添加视频)。我查看了c:\ProgramFiles\WindowsApps以查看他们的xaml长什么样子,发现他们的xaml与我的几乎相同——媒体播放器没有数据绑定。唯一的区别是他们在用户控件和包含模板中的视频播放器的网格上使用了x:ConnectionId。我不知道x:ConnectionId是什么,但他们有可能在使用它从他们的代码中访问控件吗?

你尝试过将其制作为资源,然后使用FrameworkElement.FindResource吗? - N_A
如果我将MediaPlayer移动到<Page.Resources>,那么我该如何将它放置在页面上的正确位置? - Terry
啊,对不起。我误解了组件是什么。 - N_A
1
你尝试过等到FlipView加载完成后再执行操作吗?例如等到Loaded事件触发后再执行。 - Colin Smith
1
数据绑定和辅助附加属性听起来是可行的方式,具体取决于您想要做什么。您想用这个媒体播放器做什么?到目前为止,您的XAML是什么? - Filip Skakun
标记正确答案被认为是一种礼貌行为。 - Jerry Nixon
2个回答

2
请查看http://winrtxamltoolkit.codeplex.com/downloads/get/467926,并查看VisualTreeHelperExtensions。
在可视树中没有直接查找元素的方法。您需要使用VisualTreeHelper.GetChild(flipView, i)方法。实现并不难,但工具包有一个单一的扩展方法类文件,您可以直接添加到项目中。它提供了按类型获取后代或祖先的方法。我认为它会满足您的需求。

1
如果您按类型获取后代,则会返回所有MediaPlayer的实例。那么,您如何知道哪一个在当前的FlipView视图中呢? - xster
FlipView 应该有一个“当前活动项”属性,你可以将其传递给 VisualHelper.FindChild<MediaElement>。 - Erti-Chris Eelmaa

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接