2010-11-30 79 views
0

我有一些圖片,我作爲圖標使用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控件,並試圖在視覺樹中放置兩次。由於所有控件只能有一個父母,因此您的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> 

或者使用樣式MenuItem每次設置Icon

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

而且菜單項:

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

似乎是明確的......所以,任何方式不重複 ... WIDTH = 「16」 HEIGHT = 「16」 的節點? – serhio 2010-11-30 15:49:56

+0

樣式..使用樣式爲你設置圖標..讓我更新我的答案;) – Arcturus 2010-11-30 15:52:42

1

我有同樣的問題,但明顯的解決方案並沒有解決這個問題對我來說。什麼沒有解決它在Image資源設置x:Shared="False"

<Image x:Key="DeleteIco" 
     x:Shared="False" 
     Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" 
     Width="16" Height="16"/> 

由於@Arcturus正確提到的,你目前的設置相同的圖像控制的多個控件一個孩子,這導致其從被分離以前的控制每次,然後只爲最後一個控件設置。設置x:Shared="False"將在每次請求資源時創建一個新的Image控件,從而解決問題。

有一點要注意的是,x:Shared屬性不能到處設置,所以一定要使用它在那裏,它實際上適用的(從上面的文章):

在WPF中,x:共享纔有效在以下條件下:

  • 包含與x中的項目的的ResourceDictionary:共享必須是 編譯。 ResourceDictionary不能位於寬鬆的XAML中或用於主題 。

  • 包含項目的ResourceDictionary不得嵌套在另一個ResourceDictionary中的 。例如,不能使用 x:ResourceDictionary中項目的共享位於 已經是ResourceDictionary項目的樣式中。