访问控制XAML中的DataTemplate从代码隐藏?(Access XAML Control I

2019-08-02 04:28发布

我有我不能在代码隐藏访问控制,我相信这是因为它是在DataTempalte定义。

总体控制是一个幻灯片转盘。 每个幻灯片可以是图像或MediaElement的(视频),其内容在一个的ItemSource结合被定义。 转盘是在定时器上以切换从一个滑动到下一个。 每次滑动改变我触发一个事件到这种效果。

当我打了一个幻灯片与视频,我想停止放映定时器(做到这一点),并开始播放视频,这是我碰到的一个问题。 我无法访问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>

Answer 1:

我通常会建议不要触摸UI元素的代码......但MediaElement的是一种特殊情况......也许你应该换一个用户控件(可能与一些自定义DepProps)内整个模板,这将使你的整个过更好的控制事情。

编辑:另一种方法是创建一个带有一些属性(如IsPlaying模块)的行为,并从那里操纵的MediaElement。 然后,你可以在DataTemplate中的XAML中使用此行为,而无需后面的代码或用户控件。



Answer 2:

WPF提供了一种简单和直接的方式来访问被从生成的DataTemplates命名的元素。 它是在MSDN文章中解释查找的DataTemplate生成的元素:如何 。

假设你AutoScrollCarousel从ItemsControl的衍生,你会得到ContentPresenter就是这样的一个项目的容器:

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

从ContentPresenter将会用的手段获得在DataTemplate中指定元素FindName方法:

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


文章来源: Access XAML Control In DataTemplate From CodeBehind?