ここで提案されているソリューションを見てきました: Silverlight クラス ライブラリからアプリケーションで resx にアクセスする と、リソース自体に対して機能します。
私の問題は少し異なります:
- 同じライブラリを使用する 2 つのアプリがあります。それらはローカライズされているため、リソースフォルダーがあり、アプリのフォルダーにはファイル AppResource.resx、AppResource.it-IT.resx があります
- XAML ファイルとコードも含むライブラリがあります。ローカライズされているので、リソースフォルダーがあり、アプリのフォルダーにはファイルLibResource.resx、LibResource.it-IT.resxがあります
- アプリは MvvmLight ライブラリを使用しています。示唆されているように、フィールドを追加して ViewModelBaseExtended でクラス ViewModelBase を拡張しました。
public class ViewModelBaseExtended : ViewModelBase
{
private static LibResources resources = new LibResources();
public LibResources Resources { get { return resources; } }
}
- ライブラリ内の XAML は、ローカライズされたリソースに正しくアクセスできます。
<phone:PhoneApplicationPage x:Class="PhoneClassLibrary1.MainPage"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<StackPanel x:Name="TitlePanel"
Grid.Row="0"
Margin="24,24,0,12">
<TextBlock x:Name="ApplicationTitle"
Text="{Binding Resources.AppName}"
Style="{StaticResource PhoneTextNormalStyle}" />
<TextBlock x:Name="PageTitle"
Text="{Binding Resources.LocalLib}"
Margin="-3,-8,0,0"
Style="{StaticResource PhoneTextTitle1Style}" />
</StackPanel>
私の問題は、ライブラリからアプリケーションの AppResources にアクセスするにはどうすればよいですか? ライブラリはアプリケーション間で共有され、名前空間は設計時に定義されておらず、実行時に変更されるため、名前空間.AppResources を直接参照することはできません。
正確な構成、ファイル etxc でテストする準備ができている完全なプロジェクトがあります。すべてライブラリからアプリケーション レベルへのアクセスとは別に動作します。
冒頭で述べた解決策を適用する:
private static AppResources _gResources;
public AppResources gResources { set {_gResources = value;} get { return _gResources; } }
public ViewModelBaseExtended()
{
var assembly = Application.Current.GetType().Assembly;
var ast = assembly.FullName;
char[] delimit = new char[] { ',' };
string[] parts = ast.Split(delimit);
gResources = new System.Resources.ResourceManager(parts[0]+ ".AppResources", assembly);
}
gResources は AppResource (または LibResource) クラスであり、ResourceManager は別のオブジェクトを返すため、正しくコンパイルしてもエラーが発生しません。