无法在由时钟驱动的MediaElement上设置源

时间:2012-01-06 17:18:31

标签: wpf mediaelement

我创建了一个简单的WPF应用。 在我的XAML中,我有:

<StackPanel Orientation="Horizontal">
    <MediaElement x:Name="media" Width="200" Height="200" Source="D:\Wpf project\wpfSampleApp\wpfSampleApp\Wildlife.wmv">
        <MediaElement.Triggers>
            <EventTrigger RoutedEvent="MediaElement.Loaded" SourceName="media">
                <EventTrigger.Actions>
                    <BeginStoryboard Name= "myBegin">
                        <Storyboard SlipBehavior="Slip">
                            <MediaTimeline Source="{Binding Source,ElementName=media,Mode=OneWay}" Storyboard.TargetName="media"  
         BeginTime="0:0:0" Duration="0:10:59" RepeatBehavior="Forever" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </MediaElement.Triggers>                
    </MediaElement>
    <Button x:Name="btnnext" Content="Next" Width="100" Height="30" Click="btnnext_Click"/>
</StackPanel>

在XAML.cs文件中,点击下一个按钮我必须播放下一个视频:

media.Source = new Uri(@"D:\\Wpf project\\wpfSampleApp\\wpfSampleApp\\B.wmv");
media.Play(); 

相反,我面临一个错误,上面写着“无法在时钟驱动的MediaElement上设置源代码”。

请帮我解决这个异常,我更喜欢修改XAML,而不是在XAML.cs文件中编写代码。

任何帮助将不胜感激,谢谢

3 个答案:

答案 0 :(得分:1)

派对已经很晚了,但是如果有人需要类似的东西,我发现了一个不是MVVM模式的解决方案,但对于这种情况,它应该是可以原谅的。

Xaml部分

<MediaElement Name="Player">
    <MediaElement.Triggers>
        <EventTrigger RoutedEvent="MediaElement.Loaded">
            <EventTrigger.Actions>
                <Storyboard Name="MediaBoard">
                    <MediaTimeline Source="path" Storyboard.TargetName="Player" RepeatBehavior="Forever"/>
                </Storyboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </MediaElement.Triggers>
</MediaElement>

和CodeBehind

private void ChangeLoopedVideo(Uri url)
{
     MediaTimeline timeline = new MediaTimeline(url);
     timeline.RepeatBehavior = RepeatBehavior.Forever;
     Storyboard.SetTarget(timeline, Player);
     MediaBoard.Children.Clear();
     MediaBoard.Children.Add(timeline);
     MediaBoard.Begin();
}

答案 1 :(得分:0)

我遇到了同样的问题。终于得到了解决方案。这是我实施的解决方案。

要为MediaElement设置Source,同时为它分配Clock [使用MediaTimeLine],我们应首先检查当前线程是否可以访问MediaElement。这可以通过布尔值完成 - MediaElement.CheckAccess或MediaElement.Clock.CheckAccess。

答案 2 :(得分:0)

正如错误消息所示:如果MediaElement由时钟(即您的MediaTimeline)控制,则无法设置MediaTimeline的来源。您应该将URI(仅限)的来源绑定到DataContext中的{{1}}。