0

我正在从头开始为我的应用程序构建一个媒体播放器。为了从“常规”视图转到全屏,播放器从我的 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 中似乎是不可能的。

任何帮助,将不胜感激!

4

1 回答 1

2

一些视觉元素必须保留在视觉树中才能正常工作,尤其是那些必须与媒体播放或捕捉有关的元素。我从来没有尝试过你在做什么,但我并不惊讶这是这种行为。

我想您可以捕获播放位置并在重新设置控件并再次开始播放后尝试设置它,但这需要大量工作并且可能容易出错。老实说,Windows 开发人员打算让您处理这种情况的方式是使用视觉状态。

如果您曾在 Expression Blend 中使用过LayoutAwarePage ,那么您之前可能遇到过视觉状态。LayoutAwarePage具有 Windows 8 中所有不同视图模式的状态(填充、对齐、全横向、全纵向)。但是即使您不使用LayoutAwarePage ,您也可以随时创建自己的状态。您可以在 Blend 的“状态”选项卡上创建状态(如果您没有看到该窗口,则“窗口”->“状态”)。

每个状态都必须位于一个状态中。组名无关紧要,只需了解组中的每个状态都是独占的。因此,您可以调用您的组MediaPlaybackStates并在该组内放置两个状态,称为WindowedFullScreen

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

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

我的博客上有一篇详细的文章,展示了如何使用 Visual States 来处理各种 Windows 8 窗口状态(Filled、Snapped 等)。那篇文章应该有希望让你指出正确的方向。

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

于 2013-02-26T18:24:45.903 回答