2

カスタムコントロールにボタンがあり、App.xamlファイルでリソースとして定義されている画像を次のように表示しようとしています。

<Application.Resources>
    <BitmapImage x:Key="PlusSymbol" UriSource="Resources/PlusSymbol.png" />
</Application.Resources>

何らかの理由で、Themes \ Generic.xamlファイルで定義されたカスタムコントロールのテンプレート内でこれを静的リソースとして使用できません。実行時にアプリケーションがクラッシュし、要求されたリソースが見つからないと表示されます。リソースにバインドするために使用しているxamlコードは次のとおりです。

<Button Grid.Row="0" Grid.Column="1" Margin="3">
     <Image Source="{StaticResource PlusSymbol}"/>
</Button>

Generic.xamlファイル内でまったく同じ方法でリソースを定義すると、実行時に機能しますが、テーマ/リソース/でファイルを検索しているため、ファイルが見つからないというプリコンパイラの警告が表示されます。 /Resources/だけでなく。そのため、設計時に警告が表示されますが、実行時には正常に機能します。

では、App.xamlで定義されているのに、なぜリソースが見つからないのでしょうか。これは通常のWPFプロジェクトとまったく同じ方法で行い、問題なく機能しますが、このカスタムコントロールライブラリでは問題が発生します。どんな助けでも大歓迎です!

4

2 に答える 2

2

リソースが静的ではなく実行時に動的に評価されるようにStaticResource切り替えると、これは機能するはずです。DynamicResourceに切り替えるとDynamicResource.

<Button Grid.Row="0" Grid.Column="1" Margin="3">
   <Image Source="{DynamicResource PlusSymbol}"/>
</Button>

これは、標準のリソースではなく、テーマ ベースのスタイルとテンプレートの処理方法によるものだと思います。 この回答この回答は、特に Generic.xaml と、それが other とどのように異なるかについて語っていResourceDictionariesます。

于 2013-02-28T18:46:39.583 に答える
1

したがって、これを機能させる方法は、Generic.xaml ファイルで BitmapImage を定義し、Pack URI を使用してファイルにアクセスすることでした (これは、率直に言って私を混乱させたPack URI に関する MSDN の記事です)。このように、ファイルへの相対パスを使用し、元のアセンブリを指定します (ファイルは MyCustomControlLibrary プロジェクトの \Resources\PlusSymbol.png にあり、Resource のビルド アクションがあります)。

<BitmapImage x:Key="PlusSymbol" UriSource="pack://application:,,,/MyCustomControlLibrary;component/Resources/PlusSymbol.png" />

次に、Generic.xaml のコントロール テンプレートで、次のようにリソースを使用します。

<Button Grid.Row="0" Grid.Column="1" Margin="3" Height="25" Width="25" 
      <Image Source="{StaticResource PlusSymbol}"/>
</Button>

次のように短いバージョンの Pack URI を使用できると思ってだまされたことに注意してください。

<BitmapImage x:Key="PlusSymbol" UriSource="pack://application:,,,/Resources/PlusSymbol.png" />

ただし、これは実行時にプログラムがクラッシュする原因となっていました。これがカスタム コントロール ライブラリであり、イメージの最終消費者が私の UI プロジェクトであるという事実により、実際にイメージを含むアセンブリを指定する長いバージョンが必要になると思います。

同様の問題を抱えている他の人の助けになることを願っています。

これは、Generic.xaml からアプリ レベルのリソース (カスタム コントロール ライブラリの App.xaml ファイルで定義されている) を使用して指定した元の質問に技術的に回答しているとは思わないことに注意してください。そこに PlusSymbol リソースを定義すると、依然としてプログラムがクラッシュします。ただし、App.xaml でそれを行うことは実際には気にしませんでした。設計時と実行時の両方で正しく動作するようにしようとしていました。この解決策は私にとってはうまくいき、かなり単純であり、私の研究からわかることはベストプラクティスです.

于 2013-03-04T19:09:07.013 に答える