【问题标题】:MediaElement in a ResourceDictionary Windows 8 Metro AppResourceDictionary Windows 8 Metro 应用程序中的 MediaElement
【发布时间】:2014-04-08 06:30:07
【问题描述】:

我正在为 windows 商店创建一个 windows 8 Metro 风格的应用程序。

我有一个资源字典(其中包含“代码隐藏”),它被合并到 app.xaml 中

<Application.Resources>
    <ResourceDictionary>     
        <ResourceDictionary.MergedDictionaries>
            <view:TemplatesDictionary />   
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

我正在使用字典来访问模板/颜色画笔,并在运行时根据属性/状态的变化将它们换掉。

return App.Current.Resources["SomeKey"] as Windows.UI.Xaml.Media.SolidColorBrush;

或任何我需要的类型。

到目前为止,这几乎适用于任何事情,但是我在尝试使用 MediaElements 做同样的事情时遇到了问题。

我有

<MediaElement x:Key="SFX_ButtonSound" AutoPlay="False" Source="ms-appx:///Assets/Sound/UI Click Random.wav" Volume="1" />

然后在我尝试过的代码中

(App.Current.Resources["SFX_ButtonSound"] as MediaElement).Play();

没有任何播放,但它可以访问并找到密钥。

但是,如果我将媒体元素复制粘贴到页面中,则将 x:key 更改为 x:name 然后

SFX_ButtonSound.Play();

它会玩得很好,有人可以向我解释为什么会这样吗?我假设它不起作用,因为页面上的媒体元素实例尚未“创建”或类似的东西。

我没有做过太多的 WPF/Silver-light 开发/UI 开发。我主要专注于后端开发。

编辑:因此,如果有人想知道,我尝试以这种方式处理它的原因是,我可以在代码中通过应用内控制管理音量是否静音以及其他各种各样的东西,这样所有东西都可以放在一个集中的“地方”,所以在代码中,当需要时,我可以简单地调用类似

Media.PlaySFX(string)

它会应用我当时需要的当前设置/变量。我最终要做的是创建一个用户控件,它只包含我所有的通用媒体元素(按钮点击、环境声音等)。

然后在我需要声音的每个页面中,我只是在 .resources 区域中创建了控件。

对于用户控件的 C# 文件,它有一些函数来播放/停止/测试逻辑。

【问题讨论】:

  • MediaElement 是不可见的,因此您可以将其添加到 VisualTree,如果将其用作资源,则必须将其作为模板引用到某些控件
  • @verdesrobert 嗯,有道理。我以错误的方式思考资源字典。本质上,我假设它与在每个页面/用户控件 .Resources 区域中定义资源相同,但整个应用程序的全局除外,但事实并非如此,因为我试图将 mediaElement 放入 .Resources 标记并且它起作用。 -- 我想出了一个实现我想要的解决方案 -- 我稍后会发布我的解决方案。

标签: c# xaml windows-8 windows-runtime winrt-xaml


【解决方案1】:

我相信MediaElement 需要成为可视化树的一部分才能工作,因此您确实需要将它添加到某处。也许Popup 会起作用?

【讨论】:

  • 啊,谢谢,但是添加一个弹出窗口会起作用,但我认为这并不能真正实现我所需要的(我并没有在我的 OP 中真正指定)但是你说的有道理并证实了我的想法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2012-06-29
  • 2013-08-08
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多