【问题标题】:MediaElement loses its source / buffered input when removed from Visual Tree从 Visual Tree 中删除时,MediaElement 会丢失其源/缓冲输入
【发布时间】:2013-02-27 07:39:38
【问题描述】:

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

任何帮助将不胜感激!

【问题讨论】:

    标签: c# windows-8 mediaelement


    【解决方案1】:

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

    我想您可以捕获播放位置并在重新设置控件并再次开始播放后尝试设置它,但这需要大量工作并且可能容易出错。老实说,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

    【讨论】:

    • 很好的答案@Jared。我会在早上试试这个,并酌情评论/接受你的答案。感谢您分享你的知识! :-)
    • 这非常有效——而且比我以前的要容易得多。谢谢,我可以给你的所有荣誉!
    • 太棒了!是的,我真的很喜欢视觉状态。不幸的是,很多人不知道它们的存在,但是一旦拥有它们,它们就可以轻松解决一些复杂的问题。顺便说一句,视觉状态也是控件改变外观的方式。例如,Button 具有 MouseOver、Pressed 等的视觉状态。当您编辑控件样式时,它们都是可编辑的。摇滚吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多