🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

8441閲覧

xaml上で別プロジェクトのPropertiesにあるResources.resx内の文字列リソースにアクセスするには

tride

総合スコア68

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/11/13 02:50

編集2019/11/13 03:04

MainWindow(xaml上)で別プロジェクトのPropertiesにあるResources.resx内の文字列リソースにアクセスするにはどうすればいいのでしょうか。

以下コードのように指定してもエラーが出て詰まっております。

xaml

1xmlns:properties="clr-namespace:AppResources.Properties;assembly=AppResources.Properties"

<エラー一覧>

エラー XLS0418 アセンブリ 'AppResources.Properties' が見つかりませんでした。アセンブリ参照が欠けていないか、また、プロジェクトとすべての参照アセンブリがビルドされているかどうかを確認してください。 App.WPF MainWindow.xaml エラー XDG0008 名前 "Resources" は名前空間 "clr-namespace:AppResources.Properties;assembly=AppResources.Properties" に存在しません。 App.WPF MainWindow.xaml

<ソリューション構成>
AppResources(カスタムコントロールプロジェクト)
---┗Properties
------┗Resources.resx

AppWPF(AppResourcesを参照)
---┗MainWindow.xaml


<Resources.resxの中身>
名前:HelloWorld
値:HelloWorld
アクセス修飾子:Public


<MainWindow.xamlの内容>

xaml

1<Window x:Class="AppWPF.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:properties="clr-namespace:AppResources.Properties;assembly=AppResources.Properties" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="900" Width="1440"> 9 10 <Grid> 11 <StackPanel x:Name="FooterColum" Margin="0,765,0,0"> 12 <TextBlock Text="{x:Static properties:Resources.HelloWorld}" /> 13 14 </StackPanel> 15 </Grid> 16</Window>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/11/13 03:45

AppWPFプロジェクトから、AppResourcesプロジェクトへの参照を追加していますか? ソリューションエクスプローラーで、プロジェクトへの参照を追加してください。
tride

2019/11/13 04:30

確認しましたところ、記載通り参照されていました
退会済みユーザー

退会済みユーザー

2019/11/13 07:12

UI (MainWindow.xaml) からではなく、コード (MainWindow.xaml.cs) からなら利用できると思いますが、それではダメなのでしょうか。 UI で使うには App.xaml にリソースを登録する必要があるそうですが(以下の記事参照)、Resources コンストラクタが internal で定義されているのでダメっぽいです。回避方法は自動生成されたコードを書き換える以外は自分は分かりません。 WPF での文字列リソースの利用と国際化 http://yohshiy.blog.fc2.com/blog-entry-232.html
guest

回答1

0

ベストアンサー

質問に対するコメント欄にも書きましたが・・・

UI (MainWindow.xaml) からではなく、コード (MainWindow.xaml.cs) からなら特に問題なく利用できると思います。別プロジェクトのリソースを以下の画像のように設定して(赤枠の部分がキモです)、

イメージ説明

MainWindow.xaml.cs では以下のようにすればリソースから文字列を取得して TextBlock に設定できます。

this.textBlock.Text = ClassLibrary1.Properties.Resources.HelloWorld;

UI で使うには App.xaml にリソースを登録する必要があるそうです。以下の記事を見てください。

WPF での文字列リソースの利用と国際化
http://yohshiy.blog.fc2.com/blog-entry-232.html

しかしながら、自動生成された Resources.Designer.cs のコードで Resources コンストラクタが internal で定義されているので(一番上の画像のように[アクセス修飾子]を public に設定しても)、

イメージ説明

そのままでは以下のようにエラーになってしまいます。

イメージ説明

回避方法は自動生成されたコードを書き換える以外は自分は分かりません。試してみましたが、自動生成された Resources コンストラクタのアクセス修飾子 internal を public に書き換えれば App.xaml のエラーは消えて、上に紹介した記事に従ってデータバインドを設定すれば MainWindow.xaml に以下のコードが生成されて、

イメージ説明

結果は以下のようになります。

イメージ説明

【追記】

下のコメント欄で、

なぜかもう一度publicに戻すとエラーも消えたまま、リビルドをかけてもエラーはでず、問題なく動くという挙動でした。

・・・と書かれた public は internal の間違いと理解して、自分の環境で Resources コンストラクタのアクセス修飾子を internal に戻して試してみました。

internal に戻すと上の App.xaml の画像のようにエラーが表示されるもののビルドは通ります。しかし、実行時に XamlParseException 例外がスローされます。下はその画像です。

イメージ説明

ちなみに自分の環境は Windows 10 Pro 64-bit v1909, Visual Studio Community 2015, .NET 4.6.1 です。

問題なく動くそうですが、設定の違いなのでしょうか。どのような設定になっているか詳しく書いていただけると幸いです。

投稿2019/11/13 09:43

編集2019/11/14 02:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tride

2019/11/14 00:58

上記internalからpublicに変える方法を試したところ、エラーが消えました。 ただ、なぜかもう一度publicに戻すとエラーも消えたまま、リビルドをかけてもエラーはでず、問題なく動くという挙動でした。 ただ、それとは別に、xmlnsを以下のように、最後のpropertiesを消しても治るようでした。 xmlns:properties="clr-namespace:AppResources.Properties;assembly=AppResources" ですが、色々ヒントになったという事でとりあえずベストアンサーに選ばせていただきました。
退会済みユーザー

退会済みユーザー

2019/11/14 01:14

> なぜかもう一度publicに戻すとエラーも消えたまま、リビルドをかけてもエラーはでず、問題なく動くという挙動でした。 「もう一度publicに戻す」というのは internal に戻すの間違いですか? そうだとすると、WPF のリソース周りにはバグがあるそうですので、その関係かも知れませんね。(聞いた話で未確認・未検証です。以下の記事など参照) XAML のマークアップ拡張を使った WPF での国際化 http://yohshiy.blog.fc2.com/blog-entry-242.html > 最後のpropertiesを消しても治るようでした。 それは、アセンブリ名は AppResources.Properties ではなくて、AppResources だからでしょう。コンストラクタ Resources のアクセス修飾子とは別の話だと思います。
退会済みユーザー

退会済みユーザー

2019/11/14 01:43

> なぜかもう一度publicに戻すとエラーも消えたまま、リビルドをかけてもエラーはでず、問題なく動くという挙動でした。 自分の環境で Resources コンストラクタのアクセス修飾子を internal に戻して試してみました。ビルドは通りますが、実行時に XamlParseException 例外がスローされます。後で回答欄にその画像を貼っておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問