10

ファイルを検討する | 以下を含む WPF アプリケーションの新しいプロジェクト:

  1. CustomControl1 という名前の新しいカスタム コントロール
  2. Dictionary1 と Dictionary2 という名前の 2 つの新しいリソース ディクショナリ

生成されたスタイルを Generic.xaml から取り出し、Dictionary2 に移動します。次に、次のように Dictionary2 を Dictionary1 にマージし、Dictionary1 を Generic にマージします。

<!--Generic.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Themes/Dictionary1.xaml"/>
</ResourceDictionary.MergedDictionaries>

<!--Dictionary1.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Dictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>

次に、CustomControl1 のインスタンスを MainWindow のグリッドに追加します。(この部分は問題を再現するために必要です。プロジェクトは常に正常にコンパイルされます。実行時にのみ問題が表示され、辞書を参照する必要があります。)

Dictionary1.xaml では、同じフォルダー内の別の dict にマージしているため、単純な Source="Dictionary2.xaml" が機能します。しかし、Generic.xaml では絶対 URI を使用する必要があります。上記を pack://application なしで Source="Dictionary1.xaml" に変更すると、MainWindow を構築しようとすると、IOException "リソース 'dictionary1.xaml' が見つかりません" が原因で XamlParseException が発生します。

私の質問: 相対 URI 解決に関する generic.xaml の特別な点とその理由を教えてください。

4

2 に答える 2

11

コメントを書く能力がないため、申し訳ありませんが、これを回答として投稿します。

私は同じ状況にあり、すべてがうまくいきます。Generic.xaml のパスに「pack://application」を入れる必要はありません。ただし、アセンブリの出力タイプが「Windows アプリケーション」の場合のみ。「クラス ライブラリ」の場合、パス ( Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml") にアセンブリ名を追加する必要があります。これがないと、WPF エンジンはアプリケーションのメイン アセンブリで Dictionary1.xaml を検索しようとします。

どちらの場合もターゲット フレームワークは「.NET Framework 4 Client Profile」です。

于 2011-10-12T14:08:50.770 に答える
1

推測ですが、generic.xaml は外部アセンブリからもアクセスできる必要があるため、絶対 URI を使用してどこからでもリソースを見つけられるようにする方法です。私が言ったように、それは暗闇の中での刺し傷です。

于 2010-09-18T10:56:42.800 に答える