【问题标题】:WinRT XAML Find control inside FlipView Item templateWinRT XAML 在 FlipView 项模板中查找控件
【发布时间】:2012-08-08 18:17:15
【问题描述】:

所以我有一个翻转视图来显示一篇文章,在这个翻转视图中我有一个来自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 看起来和我的几乎一样——媒体播放器上没有数据绑定。唯一的区别是它们在用户控件和包含模板中视频播放器的网格上具有 x:ConnectionId。我不知道 x:ConnectionId 做了什么 - 但他们是否有可能是使用它从他们的代码中访问控件的人?

【问题讨论】:

  • 您是否尝试过将其作为资源然后使用FrameworkElement.FindResource?
  • 如果我将 MediaPlayer 移动到 &lt;Page.Resources&gt;,我该如何将它放置在我页面上的正确位置?
  • 啊,对不起。我误解了组件是什么。
  • 您是否尝试过等到翻转视图加载后(即 Loaded 事件)
  • 数据绑定和辅助附加属性听起来像是要走的路,具体取决于您要做什么。你想用这个媒体播放器做什么?到目前为止,您的 XAML 是什么?

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


【解决方案1】:

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

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

【讨论】:

  • 如果按类型获取后代,它将返回 MediaPlayer 的所有实例。那么,您如何知道当前 FlipView 视图中是哪一个?
  • FlipView 应该具有“当前活动项目”属性,然后您可以将其传递给 VisualHelper.FindChild
【解决方案2】:

当然。如果您想访问模板中的命名控件 - 看这里http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多