我在flipView嵌入了一个mediaplayer
用于左右切换的时候,切换到上一个或下一个视频(不是好的实现方式,不过数据很少,凑合用吧)
为了让mediaplayer自动播放
我在flipView_SelectionChanged事件里查找当前显示的mediaplayer,并让它播放
private void flipView_SelectionChanged(object sender, SelectionChangedEventArgs e) { FlipView fv = sender as FlipView; if (fv.SelectedItem == null) return; if (e.AddedItems.Count > 0) { FlipViewItem initem = fv.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]) as FlipViewItem; if (initem != null) { MediaPlayer mp1 = FindFirstElementInVisualTree<MediaPlayer>(initem); mp1.Play(); } } } private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject { var count = VisualTreeHelper.GetChildrenCount(parentElement); if (count == 0) return null; for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(parentElement, i); if (child != null && child is T) { return (T)child; } else { var result = FindFirstElementInVisualTree<T>(child); if (result != null) return result; } } return null; }
但目前遇到一个问题
当第一次flipView刚呈现的时候,获取的FlipViewItem initem结果是null
当手动切换后是正常的
有人知道是什么原因,如何解决么?
谢谢
你的MediaPlayer是自定义控件?win8中没有这个控件,一般用MediaElement
我用MediaElement替换了MediaPlayer,并且找到了问题。第一次flipView_SelectionChanged事件是在fv的load事件之前发生,此时flipview中的一些逻辑可能还没有完成(例如:fv.selectedItem已经不为空,但是此时的SelectedItem中的IsSelected属性为flase)。而如果在load事件中再次获取SelectedItem中的IsSelected属性,则此时为true;获取initem也就不为null了。
看了下ContainerFromItem方法中的注视,如果item有容器并且已经在集合中,那么返回,否则返回null。应该是这个时候(loaded事件之前)容器并没有成功加入集合中
@lihaiyin:
谢谢
看来还是win8下的加载顺序和以前不一样额...
记得wp都是先处理完load然后才触发SelectionChanged
谢谢您
MediaPlayer用的是这个 https://playerframework.codeplex.com/releases
用来播放smooth streaming的
解决了吗?我也碰到这个问题了。。。
木有
后来没有用flipView
感觉flipView快速切换的时候索引有时候不是很对
结果播放的音频不是当前呈现在界面上的...