c# - 从 CodeBehind 访问 DataTemplate 中的 XAML 控件?

标签 c# wpf wpf-controls datatemplate

我有一个无法在代码隐藏中访问的控件,我相信这是因为它是在 DataTempalte 中定义的。

整体控件是幻灯片放映轮播。每张幻灯片都可以是 Image 或 MediaElement(视频),其内容在 ItemSource 绑定(bind)中定义。旋转木马位于计时器上,可以从一张幻灯片切换到下一张幻灯片。每次幻灯片更改时,我都会为此效果触发一个事件。

当我点击带有视频的幻灯片时,我想停止幻灯片计时器(这样做)并开始播放视频,这就是我遇到的问题。我无法从我的代码隐藏中访问 MediaPlayer 元素 Name。我此时的假设是因为它是一个 DataTemplate。

这个假设是否正确?如果是这样,我怎样才能从代码隐藏访问这个控件,或者(更重要的是)让它在幻灯片出现时开始播放?

<ctrl:AutoScrollCarousel ...>
    <ctrl:AutoScrollCarousel.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ctrl:AutoScrollCarousel.ItemsPanel>
    <ctrl:AutoScrollCarousel.ItemTemplate>
        <DataTemplate>
            <Border x:Name="Border" VerticalAlignment="Center"
                    Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type UserControl},Mode=FindAncestor}}">
                <Grid Background="White">
                    ...
                    <Image Source="{Binding ContentImage}" Grid.Row="1" Grid.Column="1" Stretch="UniformToFill"
                            HorizontalAlignment="Center"
                            Visibility="{Binding ContentImage, Converter={StaticResource VisibilityConverter}}" />

                    <MediaElement Name="MediaPlayer" Source="{Binding ContentVideo}" Grid.Row="1" Grid.Column="1" Stretch="UniformToFill" LoadedBehavior="Play"
                                    Visibility="{Binding ContentVideo, Converter={StaticResource VisibilityConverter}}" MediaEnded="MediaPlayer_MediaEnded" />

                    <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Title}" Foreground="Black"
                                FontFamily="Segoe UI" FontWeight="Light" HorizontalAlignment="Left" FontSize="75" Margin="0" VerticalAlignment="Center" />

                    <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding ContentHeadline}" Foreground="Black"
                                FontFamily="Segoe UI" FontWeight="Light" HorizontalAlignment="Left" FontSize="50" VerticalAlignment="Center"
                                TextWrapping="Wrap">
                    </TextBlock>
                </Grid>
            </Border>
        </DataTemplate>
    </ctrl:AutoScrollCarousel.ItemTemplate>
</ctrl:AutoScrollCarousel>

最佳答案

WPF 提供了一种简单直接的方法来访问从数据模板生成的命名元素。在 MSDN 文章 How to: Find DataTemplate-Generated Elements 中对此进行了解释.

假设您的 AutoScrollCarousel 是从 ItemsControl 派生的,您将获得作为项目容器的 ContentPresenter,如下所示:

AutoScrollCarousel carousel = ...
object item = ...
var contentPresenter =
    carousel.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;

从 ContentPresenter 中,您将通过 FindName 获取 DataTemplate 中的命名元素方法:

var dataTemplate = contentPresenter.ContentTemplate;
var mediaPlayer = dataTemplate.FindName("MediaPlayer", contentPresenter) as MediaElement;

关于c# - 从 CodeBehind 访问 DataTemplate 中的 XAML 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166726/

相关文章:

c# - WPF 自定义控件构造、触发器和事件

c# - 鼠标移动事件的问题

c# - 添加 : notation to C# for indexing into arrays

c# - 如何为 Application Insights Log4Net Appender 设置遥测 channel ?

WPF ComboBox SelectedItem

c# - 为全局独立于 CultureInfo 的所有 DateTime 对象设置 StringFormat - WPF

c# - ListBoxItem 动画和不透明度

c# - C# 故障排除中最简单的 LINQ

c# - 在时区之间转换时间

c# - LINQ 组按星期几抛出异常