3

別のプロジェクトに、WPF アプリケーションで使用したい文字列を含むデシリアライズされた xml ファイルがあります。これらの文字列は、同じソリューションの別のプロジェクトでも使用されるため、文字列を単純にwpf アプリケーションを保持するプロジェクト。

プログラムは次のように構成されています。

プロジェクト A はB と C を参照します

  • イベント ハンドラーを使用した WPF アプリケーション

プロジェクト B がCを参照

  • F# の GUI ロジック

プロジェクトC

  • XML リソース ファイルとデシリアライザー (F# で記述)

逆シリアル化された xml ファイルのオブジェクトに基づいてリソースまたはリソース ディクショナリを作成する方法はありますか? または、xml ファイルに保存されている文字列を直接参照できますか?

4

4 に答える 4

1

組み込みの .resx ファイルを使用することをお勧めします。これは、新しく作成された WPF アプリケーションにデフォルトで含まれています。(後で を使用して追加することもできますProject -> Add New Item... -> Resource File。) アクセス修飾子を「Public」に設定してください。現在のプロジェクトを参照する他のプロジェクト内で文字列を使用できるようになります。
パブリック Resx ファイル
文字列にアクセスできるようになります (および他のリソースも!) 厳密に型指定され、自動的に生成されたラッパー クラスを介して:

MessageBox.Show(WpfApplication1.Properties.Resources.String1);

XAML を使用して、このファイルに格納されている文字列にプロパティを設定することもできます。x:Static マークアップ拡張機能を使用して、(たとえば)この回答で説明されています。

xmlns:resx="clr-namespace:WpfApplication1.Properties;assembly=WpfApplication1" 
Title="{x:Static resx:Resources.String1}"

さらに、ファイルを編集するための優れた Visual Studio ビルトイン UI が得られます (画像にも表示されています)。

于 2013-09-19T20:42:46.880 に答える
0

共通のリソース文字列を使用するプロジェクトは、WPF テクノロジを使用して実装されるようです。この場合、xml の形式を少し変更して、シリアル化された形式の ResourceDictionary を含む xaml ファイルを直接作成できます。その後、ファイルを逆シリアル化するだけで、ResourceDictionary が作成されます。シリアル化と逆シリアル化は、XamlWriter と XamlReader を使用して実行できます。

コード例:

        var pc = new ParserContext
        {
            BaseUri = new Uri(runtimeResourcesDirectory , UriKind.Absolute)
        };
        ...
        using (Stream s = File.Open(resourceDictionaryFile, FileMode.Open, FileAccess.Read))
        {
            try
            {
                var resourceDictionary = XamlReader.Load(s, pc) as ResourceDictionary;
                if (resourceDictionary != null)
                {
                    Resources.MergedDictionaries.Add(resourceDictionary);
                }
            }
            catch
            {
                MessageBox.Show("Invalid xaml: " + resourceDictionaryFile);
            }
        }
    }
于 2013-09-19T14:27:46.840 に答える
0

F# プロジェクトのツールはあまり良くないので、以前の回答で提案したことは機能しません。
C# プロジェクトには、.resx ファイルに対して (ビルドの直前に) 実行され、C# ラッパー クラスを生成する "ResXFileCodeGenerator" という名前のカスタム ツールがあります。これは明らかに F# プロジェクトでは利用できません。ただし、回避策が必要です。
私の頭に浮かぶ最も簡単な方法は、つまり、C# カスタム ツールから生成された厳密に型指定されたラッパーを使用する場合、ソリューションに新しい C# クラス ライブラリを追加することです。これには resx ファイルが含まれ、ラッパー クラスが生成されます。 . から .resx ファイルを追加できますProject -> Add New Item... -> Resource File。次に、すべての F# プロジェクトからこのライブラリを参照し、生成されたラッパー クラスを使用できます。

open ClassLibrary1; // this is the C# library
...
let x = Resources.String1;

2 番目の方法は、F# プロジェクトに .resx ファイルを直接追加することです。ここで面白いのは、Visual Studio では Resource タイプの「新しい項目を追加」できないことです。これを回避するには、別の一時的なプロジェクト (タイプ C# クラス ライブラリなど) にリソース ファイルを作成し、Project -> Add Existing Itemコマンドを使用して、生成された .resx ファイルを F# プロジェクトに追加します。次に、 ResourceManagerクラスを使用して resx ファイルのリソースを使用できます(もちろん、前のケースのように、すべてのリソースに対して生成されたプロパティは必要ありません)。

open Library1
open System.Resources

[<EntryPoint>]
let main argv = 
// We are in the console application, which references Library1
// Library1 contains the .resx file.

let resourceManager = ResourceManager("Resources", typeof<Library1.Class1>.Assembly);

let x = resourceManager.GetString("String1");

0 

大文字では、Resources.resx という名前のファイルとして、リソース ファイルを (サブフローダーではなく) プロジェクトに直接追加したことに注意してください。
さらに、そのような呼び出しをプロパティ内にカプセル化するカスタム ラッパーを作成できます。

于 2013-09-22T16:30:11.180 に答える