0

私が対処しようとしている望ましいシナリオは次のようになります。

  1. MyCompany.Styles.dllアセンブリで定義されている一般的なスタイルのセットがあります。

  2. MyCompany.Styles.dllアセンブリのスタイルを使用するカスタムコントロールのセットがMyCompany.Controls.dllアセンブリにあります。

  3. MyCompany.Controls.dllアセンブリのコントロールを使用するアプリケーションは、アプリケーションのapp.xamlのMyCompany.Styles.dllアセンブリのResourceDictionaryを参照する必要はありませんが、スタイルが参照され、 MyCompany.Controls.dllアセンブリによって使用されます。

これは可能ですか?もしそうなら、どのように?

どうもありがとう、ユーゲン

4

1 に答える 1

0

可能ですので、元の質問に出くわした人のために解決策を投稿しています。

修正は、MyCompany.Controls.dll アセンブリ内の各カスタム コントロールの ResourceDictionary に目的のスタイルをマージすることです。XAML でこれを行うことはできませんでしたが、各カスタム コントロールのコンストラクターに以下の呼び出しを追加するだけで済みました。

this.MergeInResources("/MyCompany.Styles;component/default.xaml");

魔法を行う拡張メソッドは次のとおりです。

    /// <summary>
    /// Loads the resources pointed to by the (relative) path
    /// <paramref name="resourcePath"/> into the Merged Dictionaries
    /// of <paramref name="control"/>.
    /// </summary>
    internal static void MergeInResources(this FrameworkElement control,
                                          string resourcePath)
    {
        if (String.IsNullOrWhiteSpace(resourcePath))
            throw new ArgumentNullException("resourcePath");

        Uri uri = new Uri(resourcePath, UriKind.Relative);
        ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(uri);
        control.Resources.MergedDictionaries.Add(dictionary);
    }

エラー処理と ResourceDictionary キャッシュ + 共有は読者に任されています。

于 2012-10-03T16:42:55.290 に答える