0

アドイン フレームワークは初めてです。現在、UserControl を返す WPF アドインを作成しようとしています ( https://msdn.microsoft.com/en-us/library/bb909849(v=vs.110).aspxによると)。

問題は、アドインからユーザー コントロールを取得しようとすると、例外がスローされることです。

  1. 最初の例外は、「'' という名前のリソースが見つかりません。リソース名は大文字と小文字が区別されます。」でした。すべてのリソースは別のライブラリに保存されており、MEF (MAF の前) で同じことを行ったときに正常に機能しました。

  2. OK、UserControl からすべての StaticResources を削除したところ、別の例外が発生しました:「{"ファイルまたはアセンブリ 'Infralution.Localization.Wpf, PublicKeyToken=547ccae517a004b5' またはその依存関係の 1 つを読み込めませんでした。"}」。このライブラリはローカライズに使用されます。

注: 必要なすべてのライブラリは、アドインと同じフォルダーにあります。

アドイン参照ライブラリがロードされていませんか? または、どこを間違えたのですか?

4

1 に答える 1

0

アドインがアクティブ化されると、その Application.Current が null になることがわかりました。以前は、各ウィンドウにリソースを追加していませんでしたが、すべてのアドイン ライブラリには、リソースを含む App.xaml ファイルが含まれていました。したがって、プロジェクトのコンパイルは成功し、VS WPF Designers は正常に動作し、MEF を (1 つのアプリケーション ドメインで) 使用すると正常に動作しました。しかし、私が言ったように、MAF を試してみると、アドインには Application.Current インスタンスがないため、リソースがまったくありません。

ここで、すべてのアドインがホスト アプリケーションのスタイルを使用するようにするために、コントラクトを作成しました。

public interface IThemeContract : IContract
{
    /// <summary>
    /// Theme name
    /// </summary>
    string Name { get; }
    /// <summary>
    /// Theme description
    /// </summary>
    string Description { get; }
    /// <summary>
    /// Array of expected resources dictionaries
    /// </summary>
    IListContract<string> ResourceDictionaries { get; }
}

ホスト アプリケーションはそのすべてのリソースをシリアル化します。HostAdapter の一部:

    System.AddIn.Contract.IListContract<string> IThemeContract.ResourceDictionaries
    {
        get
        {
            var list = new List<string>();
            foreach (var s in _view.ResourceDictionaries)
            {
                list.Add(XamlWriter.Save(s));
            }
            return CollectionAdapters.ToIListContract<string>(list);
        }
    }

それをアドインに送信します。その後、アドインはそれを逆シリアル化します。AddInAdapter の一部:

    public override System.Windows.ResourceDictionary[] ResourceDictionaries
    {
        get
        {
            var strings = CollectionAdapters.ToIList<string>(_contract.ResourceDictionaries);
            var rds = new List<System.Windows.ResourceDictionary>();
            foreach (var s in strings)
            {
                var output = XamlReader.Parse(s);
                if ((output as System.Windows.ResourceDictionary) != null)
                    rds.Add(output as System.Windows.ResourceDictionary);
            }
            return rds.ToArray();
        }
    }

そうすれば、アプリケーションは単一のユニットのように見えます。

于 2015-02-05T13:22:53.263 に答える