2013-03-04 72 views
1

我在Windows 8商店应用程序的GridApp的itemsdetail页面的flipview内使用MediaElement控件,并且我面临着一个特殊类型的问题使用它。 MediaElement不显示视频,只有预期视频输出的黑屏,但播放视频的音频非常好。MediaElement控件不显示视频只播放Grid应用程序中视频的音频

现在我的问题的特殊部分是,在网格应用程序中有一组项目的集合(我知道每个人都可能知道这一点,只是为了让自己清楚),每组的第一项播放视频就好了我的意思是它显示的视频和音频很好,但组的其他项目只是不显示视频只是播放视频的音频。有人知道为什么会发生这种情况吗?

这里是XAML代码:

<FlipView 
x:Name="flipView" 
AutomationProperties.AutomationId="ItemsFlipView" 
AutomationProperties.Name="Item Details" 
TabIndex="1" 
Grid.RowSpan="2" 
ItemsSource="{Binding Source={StaticResource itemsViewSource}}"> 

<FlipView.ItemContainerStyle> 
    <Style TargetType="FlipViewItem"> 
     <Setter Property="Margin" Value="0,137,0,0"/> 
    </Style> 
</FlipView.ItemContainerStyle> 

<FlipView.ItemTemplate> 
    <DataTemplate> 
     <UserControl Loaded="StartLayoutUpdates" Unloaded="StopLayoutUpdates"> 
      <ScrollViewer x:Name="scrollViewer" Style="{StaticResource VerticalScrollViewerStyle}" Grid.Row="1"> 
       <Grid Margin="120,0,20,20"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="400" /> 
         <ColumnDefinition Width="40" /> 
         <ColumnDefinition Width="360" /> 
         <ColumnDefinition Width="40" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <Border BorderBrush="Black" BorderThickness="1" Width="350" HorizontalAlignment="Left" Grid.Row="0"> 
         <MediaElement x:Name="VideoSource" AutomationProperties.Name="VideoSource" Source="/Assets/Big_Buck_Bunny.mp4" HorizontalAlignment="Center" VerticalAlignment="Stretch" Height="250" Width="350" AutoPlay="False" IsLooping="True" /> 
        </Border> 
        <Border BorderBrush="Black" BorderThickness="1" Height="65" Width="350" HorizontalAlignment="Left" Grid.Row="1"> 
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
          <Button x:Name="playButton" Margin="0,0" Click="playButton_Click" Style="{StaticResource PlayAppBarButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          <Button x:Name="pauseButton" Margin="0,0" Click="pauseButton_Click" Style="{StaticResource PauseAppBarButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
         </StackPanel> 
        </Border> 
       </Grid> 
      </ScrollViewer> 
     </UserControl> 
    </DataTemplate> 
</FlipView.ItemTemplate> 

这里是后面的代码:

private void playButton_Click(object sender, RoutedEventArgs e) 
    { 
     MediaElement media = FindControl<MediaElement>(this, "VideoSource") as MediaElement; 
     media.Play(); 
    } 

    private void pauseButton_Click(object sender, RoutedEventArgs e) 
    { 
     MediaElement media = FindControl<MediaElement>(this, "VideoSource") as MediaElement; 
     media.Pause(); 
    } 

    private void stopButton_Click(object sender, RoutedEventArgs e) 
    { 
     MediaElement media = FindControl<MediaElement>(this, "VideoSource") as MediaElement; 
     media.Stop(); 
    } 

    private DependencyObject FindControl<T>(DependencyObject controlType, string ctrlName) 
    { 
     int childNumber = VisualTreeHelper.GetChildrenCount(controlType); 
     for (int i = 0; i < childNumber; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(controlType, i); 
      FrameworkElement fe = child as FrameworkElement; 
      // Not a framework element or is null 
      if (fe == null) return null; 

      if (child is T && fe.Name == ctrlName) 
      { 
       // Found the control so return 
       return child; 
      } 
      else 
      { 
       // Not found it - search children 
       DependencyObject nextLevel = FindControl<T>(child, ctrlName); 
       if (nextLevel != null) 
        return nextLevel; 
      } 
     } 
     return null; 
    } 

我希望我自己对这个问题不清楚。

+1

视频是否在另一个应用中播放?尝试http://code.msdn.microsoft.com/windowsapps/Classic-Video-Player-de838b19。 – 2013-03-04 17:25:23

+0

@Matt Harrington我不确定你在问什么,如果你问mediaelement是否支持这种格式的视频,那么它确实播放该视频格式。 – Justice 2013-03-05 17:42:58

回答

2

所以,你正在尝试将工作。不过,为了帮助,我写了一个小原型。

使用此代码背后:

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     // pause 
     var _Media = GetMediaElement(sender as Button); 
     _Media.Pause(); 
    } 

    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     // play 
     var _Media = GetMediaElement(sender as Button); 
     _Media.Play(); 
    } 

    MediaElement GetMediaElement(Button button) 
    { 
     var _Parent = button.Parent as Grid; 
     var _GrandParent = _Parent.Parent as Grid; 
     return _GrandParent.Children.First() as MediaElement; 
    } 

    private void FlipView_SelectionChanged_1(object sender, SelectionChangedEventArgs e) 
    { 
     var _FlipView = sender as FlipView; 
     foreach (var item in _FlipView.Items) 
     { 
      var _Container = _FlipView.ItemContainerGenerator.ContainerFromItem(item); 
      var _Children = AllChildren(_Container); 
      foreach (var media in _Children) 
       media.Pause(); 
     } 
    } 

    public List<MediaElement> AllChildren(DependencyObject parent) 
    { 
     if (parent == null) 
      return (new MediaElement[] { }).ToList(); 
     var _List = new List<MediaElement> { }; 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
     { 
      var _Child = VisualTreeHelper.GetChild(parent, i); 
      if (_Child is MediaElement) 
       _List.Add(_Child as MediaElement); 
      _List.AddRange(AllChildren(_Child)); 
     } 
     return _List; 
    } 
} 

,并使用此XAML:

<FlipView SelectionChanged="FlipView_SelectionChanged_1"> 
    <FlipView.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <MediaElement Source="{Binding}" AutoPlay="False" /> 
       <Grid Margin="20" VerticalAlignment="Bottom" Background="Black"> 
        <Button Click="Button_Click_1" HorizontalAlignment="Left">Pause</Button> 
        <Button Click="Button_Click_2" HorizontalAlignment="Right">Play</Button> 
       </Grid> 
      </Grid> 
     </DataTemplate> 
    </FlipView.ItemTemplate> 
    <x:String>ms-appx:/Assets/BestSingingVideoEver.wmv</x:String> 
    <x:String>ms-appx:/Assets/BestSingingVideoEver.wmv</x:String> 
    <x:String>ms-appx:/Assets/BestSingingVideoEver.wmv</x:String> 
    <x:String>ms-appx:/Assets/BestSingingVideoEver.wmv</x:String> 
</FlipView> 

确保和更新自己的视频路径。当然,你也可以列表数据绑定。我的代码只是一个原型来证明你想要做的事情是可能的。祝你好运!

我也想我可能已经解决了你的代码中的一个或两个错误。尤其是你在列表中寻找子控件的部分。以下是我的参考:http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

+0

杰瑞感谢您的回复,我正在处理您给出的原型,如果出现任何问题,将会通知您。 在同一时间,我在想,该网页中的所有其他元素从数据绑定接收他们的数据,这可能是我没有绑定媒体元素的源路径,我面临我的问题? – Justice 2013-03-05 17:34:48

+0

感谢您的原型代码所做的工作,并且您对我的代码的错误是正确的。我认为这是我搜索mediaelement控件的方式,反正非常感谢您的帮助 – Justice 2013-03-06 16:52:42