ResourceDictionary Windows 8 Metro 应用程序中的 MediaElement

本文关键字:MediaElement 应用程序 Metro Windows ResourceDictionary | 更新日期: 2023-09-27 17:57:23

我正在为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# 文件,它有几个函数来播放/停止/测试逻辑。

ResourceDictionary Windows 8 Metro 应用程序中的 MediaElement

我相信MediaElement需要成为可视化树的一部分才能工作,所以你确实需要把它添加到某个地方。也许Popup会起作用?