3
<Application x:Class="CustControls.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ControlLibrary;component/Styles/ControlResource.xaml"/>
            <ResourceDictionary Source="StringLocalization/Dictionary_fr-FR.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

ResourceDictionary のソース名Source="StringLocalization/Dictionary_fr-FR.xaml"を Source="StringLocalization/Dictionary_en-US.xaml" に変更したい

そのために私は何をすべきか。

4

1 に答える 1

5

MSDN のドキュメントでは、次のように説明されています。

「コードでは、Source プロパティを設定しません。代わりに、ResourceDictionary オブジェクトを作成するか、または読み込むことによって、ResourceDictionary オブジェクトを取得する必要があります。既存の ResourceDictionary を読み込んで、ResourceDictionary を持つ既存の XAML ファイル ストリームで XamlReader.Load を呼び出す 1 つの方法ルートに移動し、XamlReader.Load の戻り値を ResourceDictionary にキャストします。"

ResourceDictionary は、作成するかロードすることによってのみ取得できるようです。

ResourceDictionaries を使用して目的を理解することも重要です。それらを「共有リソース」として使用することを意図している場合、「埋め込みリソース」アクションを使用して辞書を構築することはできません。それらが「コンテンツ」としてマークされ、パスの場所に適切にリンクされていることを確認してください。さらに、どのリソースが他のリソースよりも選択されるかに関して Merged Dictionaries がどのように動作するかを理解することも重要です ( MSDN のドキュメントから取得)。

マージされたディクショナリ内のリソースは、マージ先のメイン リソース ディクショナリのスコープの直後にあるリソース ルックアップ スコープ内の場所を占有します。リソース キーは個々のディクショナリ内で一意である必要がありますが、キーはマージされたディクショナリのセットに複数存在できます。この場合、返されるリソースは、MergedDictionaries コレクションで順番に見つかった最後のディクショナリから取得されます。MergedDictionaries コレクションが XAML で定義されている場合、コレクション内のマージされた辞書の順序は、マークアップで提供される要素の順序になります。キーがプライマリ ディクショナリとマージされたディクショナリで定義されている場合、返されるリソースはプライマリ ディクショナリから取得されます。これらのスコープ規則は、静的リソース参照と動的リソース参照の両方に等しく適用されます。

コードを見ると、別の ResourceDictionary をアプリケーションにロードしたいだけのようです。それだけで十分な場合は、MergedDictionaries コレクションに追加するだけで十分かもしれません。

実行時にロードしたい場合は、次のコード (または同様のもの) を使用できます。リソースを埋め込んでいないことを確認してください。

    try
    {
        string path = @".\Themes\Dictionary1.xaml";
        var xmlTextReader = new XmlTextReader(path);
        var resourceDictionary = (ResourceDictionary)XamlReader.Load(xmlTextReader);
        Application.Current.Resources.MergedDictionaries.Clear();
        Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
    }
    catch (Exception exception)
    {
        Debug.WriteLine(exception.Message);
    }

必要な場合のコードは次のとおりです。これが役立つかどうか教えてください。

于 2012-10-22T11:45:20.467 に答える