从Visual Tree中删除时,MediaElement丢失其源/缓冲输入

时间:2013-02-26 17:05:44

标签: c# windows-8 mediaelement

我正在从头开始为我的应用构建媒体播放器。为了从“常规”视图转到全屏,播放器将从我的XAML的一部分中删除并插入另一部分 - 如下所示:

if (Trailer.IsFullScreen())
{
    // some code here

    var mediaPlayer = Trailer; // Trailer is the media player usercontrol
    TrailerFullScreenGrid.Children.Remove(Trailer);
    TrailerWrapper.Children.Add(mediaPlayer);

    // more code here
}
else
{
     // some code here

     var mediaPlayer = Trailer;
     TrailerWrapper.Children.Remove(Trailer);
     TrailerFullScreenGrid.Children.Add(mediaPlayer);

     // more code here
 }

现在,当我执行此操作时,视频无法继续播放,如果单击播放按钮,则会重新启动整个剪辑。我想要的是暂停电影,做我所有的xaml魔术,然后从暂停时继续播放。我已经阅读了有关UnloadedBehaviour的内容,但在Windows 8 RTM中似乎不太可能。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

某些视觉元素必须保留在可视树中才能正常工作,尤其是必须使用媒体播放或捕获的元素。我从来没有尝试过你正在做的事情,但这并不让我感到惊讶,这就是行为。

我想你可以捕获播放位置,并在重新设置控件并再次开始播放后尝试设置它,但这是很多工作并且可能容易出错。说实话,Windows开发人员打算让您处理这种情况的方式是使用Visual States。

如果您在Expression Blend中使用 LayoutAwarePage ,则可能会遇到过Visual States。 LayoutAwarePage 具有Windows 8中所有不同视图模式的状态(填充,捕捉,完整风景,全肖像)。但即使您不使用 LayoutAwarePage ,也可以随时创建自己的状态。您可以在混合中的状态选项卡上创建状态(窗口 - >状态,如果您没有看到该窗口)。

每个州必须居住在州群组。组名无关紧要,只要了解组中的每个州都是独占的。因此,您可以将您的论坛称为 MediaPlaybackStates ,并在该组内部放置两个名为 Windowed FullScreen 的状态。

您已经定义了两种状态,您可以使用Blend来设计它们。您只需选择状态并更改所需的任何属性即可。然后在运行时,当您告诉框架进入该状态时,它会回放您的“记录”更改,甚至可以为您设置动画。

当然,一个问题是您无法使用Visual State更改控件的父级。相反,请考虑将播放器周围的所有控件分组到可以在进入“全屏”模式时折叠的面板中。使用网格控件展开所有内容,并确保播放器所在的 / 单元格设置为“*”大小调整。这意味着当其他控件折叠时,它将占用所有可用空间。

我在我的博客上有一篇详细的文章,展示了如何使用Visual States来处理各种Windows 8窗口状态(填充,捕捉等)。希望这篇文章可以帮助你找到正确的方向。

http://jaredbienz.wordpress.com/2012/04/22/wp-to-w8-view-states-using-visual-state-manager/

当您准备好在运行时更改状态时,请调用

VisualStateManager.GoToState(this, "FullScreen", true);

第一个参数( this )表示我们正在改变整个窗口的状态。第二个参数是我们要切换到的状态的名称,最后一个参数是您是否要在状态中使用转换(或动画)。

开发人员的支持,设计支持和更加出色的善意:http://bit.ly/winappsupport