2010-11-30 8 views
0

を表示していないI私はContextMenuアイテムのアイコンとして使用する一部の画像があります。たContextMenuアイコン

<UserControl.Resources> 
    <Image x:Key="DeleteIco" Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" Width="16" Height="16"/> 
    ... 
    <ContextMenu x:Key="MyMenu1"> 
     <MenuItem Header="Delete" Icon="{StaticResource DeleteIco}"/> 
    </ContextMenu> 

    <ContextMenu x:Key="MyMenu2"> 
     <MenuItem Header="Delete me" Icon="{StaticResource DeleteIco}"/> 
    </ContextMenu> 
<UserControl.Resources> 

は時々最初のメニューは、アイコンを欠場し、時には二...なぜ?私はコード内のアイコンで何もしません。

答えて

2

Imageコントロールを作成し、それをビジュアルツリーに2回挿入しようとしました。すべてのコントロールに親が1つしかないため、Imageは切断されています。したがって、もう一度それを使用すると、最初のアイコンが切断され、アイコンが表示されなくなります。

あなたのリソースに代わりImageを追加することが、ImageSourceないことによって、この問題を解決することができます

<BitmapImage x:Key="DeleteIco" UriSource="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" /> 

あなたのメニューは、それはしかし動作させるためのビットを変更することがあります。

<ContextMenu x:Key="MyMenu1"> 
    <MenuItem Header="Delete"> 
     <MenuItem.Icon> 
       <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/> 
     </MenuItem.Icon> 
    </MenuItem> 
</ContextMenu> 

<ContextMenu x:Key="MyMenu2"> 
    <MenuItem Header="Delete me"> 
     <MenuItem.Icon> 
       <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/> 
     </MenuItem.Icon> 
    </MenuItem> 
</ContextMenu> 

更新:

また、スタイルを使用しての基本的なプロパティを設定することもできますあなたのための

<Style TargetType="Image"> 
    <Setter Property="Width" Value="16"/> 
    <Setter Property="Width" Value="16"/> 
</Style> 

それともIconを毎回設定するMenuItemのスタイルを使用します。

<Style TargetType="MenuItem" x:Key="DeleteMenuIcon"> 
    <Setter Property="Icon"> 
     <Setter.Value> 
      <Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/> 
     </Setter.Value> 
    </Setter> 
</Style> 

とのMenuItem:

<MenuItem Header="Delete me" Style="{StaticResource DeleteMenuIcon}" /> 
+0

どのような方法は、 ...幅= "16" 高さ= "16" ノードを繰り返さないので...明らかであるように思わ? – serhio

+0

スタイル..あなたのアイコンを設定するためのスタイルを使用してください。私の答えを更新してください;) – Arcturus

+0

これはもっと喜んでいます...しかしIcon = ""の代わりにを使うことを余儀なくされました: – serhio

1

私は同じ問題を抱えていたが、マークされた解決策は私のためにそれを解決しませんでした。は、それがImageリソース上x:Shared="False"を設定して解決したのは何

@Arcturusが正しく述べたように、あなたは現在、それはから取り外すことになり、複数のコントロールの子と同じイメージコントロールを設定している
<Image x:Key="DeleteIco" 
     x:Shared="False" 
     Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" 
     Width="16" Height="16"/> 

前回の制御を毎回行い、最後の制御に対してのみ設定することができる。 x:Shared="False"を設定すると、リソースが要求されるたびに新しいImageコントロールが作成され、問題が解決されます。注意すべき

ことの一つはx:Shared属性はどこにでも設定されているので、それは(上記の記事から)実際に適用だところ、あなたがそれを使用していることを確認することができないということです:WPFで

、×:共有のみ有効です。

  • Xとの項目が含まれてのResourceDictionary:以下の条件の下での共有は、コンパイル でなければなりません。 ResourceDictionaryは、緩いXAML内にあることはできません。また、テーマには を使用してください。

  • 項目を含むResourceDictionaryは、 が別のResourceDictionary内にネストしていてはいけません。たとえば、 x: が既にResourceDictionaryアイテムであるStyle内のResourceDictionary内のアイテムには共有されません。

+0

' x:Shared'をおかげでありがとう。インテリセンスはそれを表示することさえできませんでしたが、私がこれを追加するとすぐに機能しました! – rodrigogq