ローカルパス(リソース?)から指定する方法がわかりません。
まず結論から(画像なんかはまた話が違ってきます)
exeに埋め込みたい場合:
Properties
の中のResources.resx
を開いて、wavファイルをドラッグ&ドロップで入れてください。
Properties
がない場合(.NET Coreや.NET 5以降だとデフォルトで作られません)
Properties
フォルダを作って中に「リソース ファイル」Resources.resx
を新しい項目から追加します。
↓のように使用します。
cs
1new SoundPlayer(Properties.Resources.PropertiesResources).Play();
相対パスで指定したい場合:
wavファイルのプロパティでビルドアクションをなしかコンテンツにして、「出力ディレクトリにコピー」を、「常にコピーする」または「新しい場合にコピーする」としてください。
(カレントディレクトリを変更しなければ)↓のように使用します。
cs
1new SoundPlayer("Resources/None.wav").Play();
わたしもこのあたり結構難しいなと感じていたのでまとめてみました。
ビルドアクション - リソース(Resource)
WPFで新たに入った埋め込み方法。
埋め込みリソースと仕組みは同じだが、xamlから簡単に読めるようになっている。
画像なんかはこれ一択でしょう。
ビルドアクション - コンテンツ(Content)
埋め込まれません。
「出力ディレクトリにコピー」を、「常にコピーする」または「新しい場合にコピーする」にしないと意味がない。
カレントディレクトリを変更していなければ、相対パスで読める。
なし(None)との違いはよくわからない^^;
ビルドアクション - なし(None)
埋め込まれません。
「出力ディレクトリにコピー」を、「常にコピーする」または「新しい場合にコピーする」にしないと意味がない。
カレントディレクトリを変更していなければ、相対パスで読める。
ビルドアクション - 埋め込みリソース(Embedded Resource)
昔からある埋め込み方法。
ビルドアクションでわざわざこれを選ぶ理由はない?
Properties.Resources.resx
Windows フォームでリソースといえばこれ。
埋め込みリソースになるが専用のGUIがついていてわかりやすいし、アクセスが簡単になるように自動でコード生成される。
xamlで使うつもりがないのであれば、これでいいのかな?
アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル - WPF .NET Framework | Microsoft Docs
One more time about Resource vs. EmbeddedResource – Ivan Krivyakov
xml
1<Window
2 x:Class="Questions375405.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 Width="800"
6 Height="450">
7 <StackPanel>
8 <Button Click="ResourceButton_Click" Content="Resource" />
9 <Button Click="ContentButton_Click" Content="Content" />
10 <Button Click="NoneButton_Click" Content="None" />
11 <Button Click="EmbeddedResourceButton_Click" Content="EmbeddedResource" />
12 <Button Click="PropertiesResourcesButton_Click" Content="PropertiesResources" />
13 </StackPanel>
14</Window>
cs
1using System;
2using System.Media;
3using System.Reflection;
4using System.Windows;
5
6namespace Questions375405
7{
8 public partial class MainWindow : Window
9 {
10 public MainWindow()
11 {
12 InitializeComponent();
13
14 //Environment.CurrentDirectory = @"C:\";
15 }
16
17 // ビルドアクション - リソース(Resource)
18 private void ResourceButton_Click(object sender, RoutedEventArgs e)
19 {
20 var uri = new Uri("Resources/Resource.wav", UriKind.Relative);
21 var info = Application.GetResourceStream(uri);
22 new SoundPlayer(info.Stream).Play();
23 }
24
25 // ビルドアクション - コンテンツ(Content)
26 private void ContentButton_Click(object sender, RoutedEventArgs e)
27 {
28 var uri = new Uri("Resources/Content.wav", UriKind.Relative);
29 var info = Application.GetContentStream(uri);
30 new SoundPlayer(info.Stream).Play();
31
32 // カレントディレクトリを変更しないのであればこれでいい
33 //new SoundPlayer("Resources/Content.wav").Play();
34 }
35
36 // ビルドアクション - なし(None)
37 private void NoneButton_Click(object sender, RoutedEventArgs e)
38 {
39 var uri = new Uri("Resources/None.wav", UriKind.Relative);
40 var info = Application.GetRemoteStream(uri);
41 new SoundPlayer(info.Stream).Play();
42
43 // カレントディレクトリを変更しないのであればこれでいい
44 //new SoundPlayer("Resources/None.wav").Play();
45 }
46
47 // ビルドアクション - 埋め込みリソース
48 private void EmbeddedResourceButton_Click(object sender, RoutedEventArgs e)
49 {
50 var assembly = Assembly.GetExecutingAssembly();
51 var stream = assembly.GetManifestResourceStream("Questions375405.Resources.EmbeddedResource.wav");
52 new SoundPlayer(stream).Play();
53 }
54
55 // Properties.Resources.resx
56 private void PropertiesResourcesButton_Click(object sender, RoutedEventArgs e)
57 {
58 new SoundPlayer(Properties.Resources.PropertiesResources).Play();
59 }
60 }
61}
xml
1<Project Sdk="Microsoft.NET.Sdk">
2
3 <PropertyGroup>
4 <OutputType>WinExe</OutputType>
5 <TargetFramework>net6.0-windows</TargetFramework>
6 <Nullable>enable</Nullable>
7 <UseWPF>true</UseWPF>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <None Remove="Resources\Content.wav" />
12 <None Remove="Resources\EmbeddedResource.wav" />
13 <None Remove="Resources\Resource.wav" />
14 </ItemGroup>
15
16 <ItemGroup>
17 <Content Include="Resources\Content.wav">
18 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
19 </Content>
20 </ItemGroup>
21
22 <ItemGroup>
23 <EmbeddedResource Include="Resources\EmbeddedResource.wav" />
24 </ItemGroup>
25
26 <ItemGroup>
27 <Resource Include="Resources\Resource.wav" />
28 </ItemGroup>
29
30 <ItemGroup>
31 <Compile Update="Properties\Resources.Designer.cs">
32 <DesignTime>True</DesignTime>
33 <AutoGen>True</AutoGen>
34 <DependentUpon>Resources.resx</DependentUpon>
35 </Compile>
36 </ItemGroup>
37
38 <ItemGroup>
39 <EmbeddedResource Update="Properties\Resources.resx">
40 <Generator>ResXFileCodeGenerator</Generator>
41 <LastGenOutput>Resources.Designer.cs</LastGenOutput>
42 </EmbeddedResource>
43 </ItemGroup>
44
45 <ItemGroup>
46 <None Update="Resources\None.wav">
47 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
48 </None>
49 </ItemGroup>
50
51</Project>