2

WPFアプリケーションでVS2008ImageLibrary/Actions / pngformatのいくつかのアイコンを使用して、WinFormsの[標準アイテムの挿入]コマンドのように、よりVisualStudioのルックアンドフィールを取得したいと考えています。
画像をリソースとして追加し、xamlファイルで参照しました。

<DockPanel.Resources>
        <Image x:Key="NewIcon" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/>
</DockPanel.Resources>

そして、メニューとツールバーに画像を追加しました

<MenuItem Command="ApplicationCommands.New" Icon="{StaticResource NewIcon}"/>
<!-- ... -->
<Button Command="ApplicationCommands.Save"><StaticResourceExtension ResourceKey="SaveIcon"/></Button>

ただし、メニューを開くと、ボタンがないかのようにツールバーからアイコンが消えます。この種の問題は、.NETがVistaアイコン/圧縮PNGをサポートしていないために発生することを他の場所で読んだことがありますが、私はこれがまったく同じ問題かどうかはわかりません。フォーマットを変更してこれを回避する試みは失敗したか、最適ではない結果(透明性の喪失など)が得られました。誰かがこれを行うためのより良い方法を知っていますか?

編集:この問題を抱えている他の人にとって、参照ごとに<DockPanel.Resources>タグに異なるキーを使用して重複エントリを作成することは、十分に機能的な回避策のようですが、必要に応じて画像が再び消えることが心配です。何らかの理由でリロードされます。

4

2 に答える 2

4

ボタンで使用するために別のリソースを定義する必要があると思います:

    <DockPanel.Resources>
        <Image x:Key="NewIconForMenu" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/>
<Image x:Key="NewIconForButton" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/>
</DockPanel.Resources>

Image リソースを宣言すると、基本的に Image タイプのオブジェクトが作成されると思います。その後、Icon プロパティと Content プロパティを設定して、MenuItem と Button の子にします。したがって、ツリーではなくなります。これは違法です。

NewIcon も使用する 2 番目のボタンを宣言しようとすると、論理ツリーの例外が発生します。

MenuItem がその例外をどのようにエスケープしたかはわかりません。イメージを独自の論理的な子コレクションに追加する前に、Button の子から Image 要素を削除するのが十分に賢明かもしれません (これが消える方法です)。

さて、もっと簡単な解決策を見つけました。x:Shared="false" をディクショナリの画像宣言に追加できます。これにより、そのイメージの新しいインスタンスが作成され、wpf ツリー ルールに違反しないことが保証されます。

于 2009-04-17T14:38:28.023 に答える
1

透明度を失うフォーマットを使用し、透明度キーをその背景色に設定します。

于 2009-03-26T02:36:13.437 に答える