Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用程序范围内按下按钮时播放声音_C#_Wpf_Xaml - Fatal编程技术网

C# 在应用程序范围内按下按钮时播放声音

C# 在应用程序范围内按下按钮时播放声音,c#,wpf,xaml,C#,Wpf,Xaml,我有一个WPF应用程序,应该在触摸屏上使用。在整个应用程序中,我被要求在按下屏幕上的按钮时播放声音。 我的想法是创建一种风格来做到这一点,在我的应用程序中包括资源词典。它运行得很好。 但是,这种样式在一个单独的DLL中,我希望我的主应用程序更改下面声音文件BoutonClickSound Url的路径。但是我找不到一个方法来做。 我尝试过一些丑陋的事情,比如: System.Windows.Application.Current.Resources.MergedDictionaries[

我有一个WPF应用程序,应该在触摸屏上使用。在整个应用程序中,我被要求在按下屏幕上的按钮时播放声音。 我的想法是创建一种风格来做到这一点,在我的应用程序中包括资源词典。它运行得很好。 但是,这种样式在一个单独的DLL中,我希望我的主应用程序更改下面声音文件BoutonClickSound Url的路径。但是我找不到一个方法来做。 我尝试过一些丑陋的事情,比如:

    System.Windows.Application.Current.Resources.MergedDictionaries[0]["BoutonClickSound"] = new Uri(m_MainVM.ButClickSoundPath);
System.Windows.Application.Current.Resources.MergedDictionaries[0].MergedDictionaries[0]["BoutonClickSound"] = new Uri(m_MainVM.ButClickSoundPath);
但它们似乎都不起作用

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"
                xmlns:sys="clr-namespace:System;assembly=System">

<sys:Uri x:Key="BoutonClickSound">c:\buttonclick.wav</sys:Uri>

<Style TargetType="{x:Type FrameworkElement}"  x:Key="SoundButton">
    <Style.Triggers>
        <EventTrigger RoutedEvent="PreviewMouseDown">
            <SoundPlayerAction x:Name="SoundPlayer" Source="{DynamicResource BoutonClickSound}" />
        </EventTrigger>
    </Style.Triggers>
</Style>

<Style TargetType="{x:Type primitives:Selector}"  x:Key="SoundSelectionChange">
    <Style.Triggers>
        <EventTrigger RoutedEvent="SelectionChanged">
            <SoundPlayerAction x:Name="SoundPlayer" Source="{DynamicResource BoutonClickSound}" />
        </EventTrigger>
    </Style.Triggers>
</Style>
你知道怎么做吗


谢谢。

只需声明一个具有相同密钥的本地资源

如果您希望在应用程序中全局使用它,可以在从库中包含合并词典后将其添加到合并词典中

添加另一项,如下所示:

<sys:Uri x:Key="BoutonClickSound">c:\differentfile.wav</sys:Uri>
添加后,如果以后要对其进行更改,则无法重新添加,必须对其进行修改:

Resources["BoutonClickSound"] = new Uri("your uri here");

穆哲,谢谢你的回复。如果我想通过代码隐藏来设置BoutonClickSound URI呢?是否可以在App.xaml和.cs中进行设置?我在App.xaml中添加了ResourceDictionary,并在之后添加了本地键。这样行。但是当我尝试使用Resources[BoutonClickSound]=new Urifilepath;,更改App.cs应用程序启动事件时,它似乎没有更新声音文件。。。实际上,要播放的wav文件的名称将来自一个配置文件,因此在编译时不会被知道。据我所知,您最初是在ResourceDictionary中定义该ResourceKey,并将其作为合并字典包含在App.xaml中。在这种情况下,如果要在应用程序级别覆盖它,则必须将资源添加到以后的字典中。例如,如果您从另一个项目链接到的ResourceDictionary是Resources.MergedDictionary[0],则必须向Resources.MergedDictionary[1]或更高版本添加一个条目才能覆盖它。是的,在xaml中覆盖ResourceKey时,它会起作用。但我想通过代码来覆盖它,文件路径将来自配置文件,但它似乎不起作用。它仍然播放xaml文件中覆盖的文件名。我刚刚用代码测试了它,它对我有效。我在App.xaml文件中包括一个ResourceDictionary,然后在Application.OnStartup override的代码中重写相同的键。我只是用语法Resources[resourceKey]=newURI。。。;如果存在重复密钥,App.xaml中的资源字典将覆盖任何合并字典。
Resources["BoutonClickSound"] = new Uri("your uri here");