2

コードビハインドでアクセスできないコントロールがありますが、それは DataTempalte で定義されているためだと思います。

全体的なコントロールは、スライド ショーのカルーセルです。各スライドは、Image または MediaElement (ビデオ) にすることができ、そのコンテンツは ItemSource バインディングで定義されます。カルーセルは、1 つのスライドから次のスライドに切り替えるためのタイマーになっています。スライドが変わるたびに、その効果のためにイベントを発生させます。

ビデオでスライドをヒットしたときに、スライド タイマーを停止して (完了)、ビデオを開始したいのですが、ここで問題が発生しました。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>
4

2 に答える 2

4

WPFは、DataTemplatesから生成された名前付き要素にアクセスするためのシンプルで簡単な方法を提供します。これは、MSDNの記事「方法:DataTemplateで生成された要素を見つける」で説明されています。

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;
于 2012-10-31T22:18:32.353 に答える
2

私は通常、コードからUIElementsに触れないことをお勧めします...しかし、MediaElementは特別なケースです...おそらく、テンプレート全体をユーザーコントロール内にラップする必要があります(おそらくいくつかのカスタムDepPropsを使用)。これにより、全体をより適切に制御できますもの。

編集: 別のアプローチは、いくつかのプロパティ (IsPlaying など) を持つ動作を作成し、そこからメディア要素を操作することです。次に、DataTemplate の XAML でこの動作を使用できます。コード ビハインドやユーザー コントロールは必要ありません。

于 2012-10-31T20:40:40.403 に答える