MediaElement控件不显示视频只播放Grid应用程序中视频的音频
问题描述:
我在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;
}
我希望我自己对这个问题不清楚。
答
所以,你正在尝试将工作。不过,为了帮助,我写了一个小原型。
使用此代码背后:
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
视频是否在另一个应用中播放?尝试http://code.msdn.microsoft.com/windowsapps/Classic-Video-Player-de838b19。 – 2013-03-04 17:25:23
@Matt Harrington我不确定你在问什么,如果你问mediaelement是否支持这种格式的视频,那么它确实播放该视频格式。 – Justice 2013-03-05 17:42:58