11

実行時に WPF コントロールをホストする必要がある Windows フォーム アプリケーションがあります。(ElementHost コントロールを使用して) 基本的なホスティングと対話が完了し、WPF コントロールで定義済みのカスタム リソース ディクショナリを使用する必要があることを実行しようとするまで、すべて正常に動作します。(WPF コントロールとそのすべてのリソース ディクショナリは、すべて同じ WPF コントロール ライブラリ DLL で定義されています。)

それが起こるとすぐに、次のようなエラーがたくさん表示されます。

System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='DocumentHeaderInterestStyle'

参考文献を 1 つ見つけました(アーカイブのためリンクが切れているようです。これ は最初に参照された記事と同じかもしれません)。これについては話していますが、この記事は WPF 側からアプローチしているように見えますが、すべてがスタンドアロンの WPF アプリケーションで機能するため、WPF コントロールを変更する必要はありません。

これを達成する唯一の方法が WPF 側で変更することである場合は、それらの変更を行うことができます (私は WPF コントロール ライブラリの責任者ではありませんが、同じ会社で働いている人なので問題ありません)変更を加える時間を得るよりも.) しかし、これを機能させるために WinForms 側で何かできることを望んでいます。

WPF コントロール ライブラリには、次のプロパティを持つプロジェクトで定義された "Default.xaml" という名前のリソース ディクショナリ ファイルがあります。

ビルド アクション: ページを出力ディレクトリにコピー: コピーしない カスタム ツール: MSBuild:Compile

スタンドアロン WPF アプリケーションの App.xaml ファイルには、次のエントリがあります。

    <ResourceDictionary x:Uid="ResourceDictionary_1">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Uid="ResourceDictionary_2" Source="/SmartClient.Infrastructure;component/Themes\Default.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

コントロール ライブラリは、そのリソースを取得する方法を既に知っているはずです。Resources.MergedDictionaries.Add() を使用するとうまくいくように見えますが、既存の辞書のインスタンスはどこで取得できますか?

4

3 に答える 3

4

必要なリソースがわかっていると仮定すると (そのように聞こえます)、それらを自分で「注入」できるはずです。何かのようなもの:

var wpfControl = new ...;
wpfControl.Resources.Add(...);
elementHost.Child = wpfControl;

あなたの質問では、コントロール ライブラリに既存のリソース ディクショナリがあると述べています。もしそうなら、あなたはこれを行うことができます:

var wpfControl = new ...;
wpfControl.Resources.MergedDictionaries.Add(/* instance of existing dictionary */);
elementHost.Child = wpfControl;
于 2009-02-23T21:43:32.067 に答える
2

アセンブリに埋め込まれたリソース ディクショナリをロードするために、実行時にそれらをロードするために次のスニペットを使用しました。

//using System.Windows
ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative);

Application.Current.Resources.MergedDictionaries.Add(dict);

これは、実行可能ディレクトリに辞書をロードする場合にも機能します。

于 2009-07-21T19:05:51.440 に答える
1

スタイル/テンプレート/リソースが多くのファイルに分割されており、それらを 1 つのリソース ディクショナリ ( ) に集約できるResources1.xamlとします。リソース ディクショナリは、コントロールの xaml ファイルでコントロールに簡単に追加できます。以下の例を参照してください。Resources2.xamlAllResources.xaml

(!)を設定Resources1.xamlし、アクションをビルドしResources2.xamlます。AllResources.xamlPage

Resources1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ControlTemplate x:Key="ScrollViewerControlTemplate" TargetType="{x:Type ScrollViewer}">
        ...
    </ControlTemplate>

    <LinearGradientBrush x:Key="VerticalScrollBarBackground" EndPoint="1,0" StartPoint="0,0">
        ...
    </LinearGradientBrush>

    <Style x:Key="StyleA" TargetType="{x:Type ScrollBar}">
        ...
    </Style>

</ResourceDictionary>

Resources2.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">


    <Style x:Key="StyleB" TargetType="{x:Type ScrollBar}">
        ...
    </Style> 

    <Style x:Key="StyleC" TargetType="{x:Type TextBlock}">
        ...
    </Style>

</ResourceDictionary>

AllResources.xaml

AllResources.xaml への相対パスとしてリソース ディクショナリ ソースを追加します。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Resources1.xaml" />
        <ResourceDictionary Source="Resources2.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

最後に UserControl で

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/projectName;component/PathToTheFileRelativeToProjectRootDirectory/AllResources.xaml
        <converters:StringToUpperCaseConverter x:Key="StringToUpperCaseConverter" />
        <converters:LocalizationEntryToStringCaseConverter x:Key="LocalizationEntryToStringCaseConverter" />
    </ResourceDictionary>
</UserControl.Resources>
于 2015-09-08T13:29:00.113 に答える