2011-06-24 62 views
5

我想設置我的菜單項的圖標這樣的菜單項 -無法設置圖標使用ItemContainerStyle

<Grid> 
    <Grid.Resources> 
     <Image 
       x:Key="ReportIconImage" Height="20" Width="20" 
       Source="/Resource/flag.png"/> 
     <Image 
       x:Key="ReportIconImage1" Height="20" Width="20" 
       Source="/Resource/flag.png"/> 
    </Grid.Resources> 
    <Menu Height="22" Margin="0,9,0,0" Name="menu1" VerticalAlignment="Top"> 
     <MenuItem Header="Menu"> 
      <MenuItem Header="Save" ></MenuItem> 
      <MenuItem Header="Open"/> 
      <MenuItem Header="Exit"/> 
      <MenuItem.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter 
         Property="Icon" 
         Value="{StaticResource ReportIconImage}"> 
        </Setter> 
       </Style> 
      </MenuItem.ItemContainerStyle> 
     </MenuItem> 
     <MenuItem Header="Edit"> 
      <MenuItem Header="Undo"/>     
      <MenuItem Header="Redo"/>      
      <Separator/> 
      <MenuItem Header="Cut"/>      
      <MenuItem Header="Copy"/>      
      <MenuItem Header="Paste"/> 
      <MenuItem.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter 
         Property="Icon" 
         Value="{StaticResource ReportIconImage1}"> 
       </Setter> 
       </Style> 
      </MenuItem.ItemContainerStyle> 
     </MenuItem> 
    </Menu> 
</Grid> 

,但將只顯示最後一個菜單項的圖標,而不是爲第2位。

enter image description here

應用示例 - http://weblogs.asp.net/blogs/akjoshi/Samples/WPFMenuItemBugSample.zip

任何人都可以提供這種行爲和可能的解決方案/解決方法的原因。

回答

8

這是因爲您在資源中使用了ImageImage是一個控件,和其他任何控件一樣 - 只能有一個父對象。默認情況下,WPF將嘗試共享所有使用者的資源。因此,最後MenuItem「獲得」對Image和其他MenuItem的監管權利甚至不允許週末訪問。

爲了改善這種情況,你既可以設置Image爲非共享:

<Image x:Shared="False" .../> 

或者更好的是,體現你的圖像資源的適當ImageSource子和共享,而不是:

<BitmapImage x:Key="ReportIconImage" Uri="/Resource/flag.png"/> 
... 
<Setter Property="Icon"> 
    <Setter.Value> 
     <Image Source="{StaticResource ReportIconImage}"/> 
    </Setter.Value> 
</Setter> 
+0

感謝肯特,但不幸的是這兩個解決方案不起作用。沒有第一個和第二個產生以下異常的影響: - 不能將'System.Windows.Controls.Image'類型的內容添加到'System.Object'類型的對象。標記文件'Sample; component/window1.xaml'中的對象'System.Windows.Controls.Image'出錯27行34. – akjoshi

+0

如果有幫助,我已經上傳了在問題中重現此問題的示例應用程序; – akjoshi

+2

@akjoshi:謝謝你的回覆。將您的項目切換到WPF 4允許我的第一個建議工作,所以必須在3.5中有一個錯誤。至於我的第二個建議,這不會工作,因爲WPF試圖在所有MenuItems中使用相同的圖像,就像我在我的答案中描述的那樣。如果有一個'IconTemplate'屬性,你會使用它。不幸的是,'MenuItem'沒有足夠精細的一個,所以我只能建議覆蓋'Template'。沮喪地說至少。 –

0

它會工作,直接添加一個圖標屬性到每個菜單項直接,而不使用風格?也許我錯過了一些東西,但這是我在應用程序中所做的。

<Grid> 
    <Menu Height="22" Margin="0,9,0,0" Name="menu1" VerticalAlignment="Top"> 
     <MenuItem Header="Menu"> 
      <MenuItem.Icon> 
       <Image Height="20" Width="20" Source="/Resourceflag.png"/> 
      </MenuItem.Icon> 

      <MenuItem Header="Save" ></MenuItem> 
      <MenuItem Header="Open"/> 
      <MenuItem Header="Exit"/> 
     </MenuItem> 
     <MenuItem Header="Edit"> 
      <MenuItem.Icon> 
       <Image Height="20" Width="20" Source="/Resourceflag.png"/> 
      </MenuItem.Icon> 

      <MenuItem Header="Undo"/>     
      <MenuItem Header="Redo"/>      
      <Separator/> 
      <MenuItem Header="Cut"/>      
      <MenuItem Header="Copy"/>      
      <MenuItem Header="Paste"/> 
     </MenuItem> 
    </Menu> 
</Grid> 
5

有點晚了,但這裏有一個解決方案,爲我工作。

我用了一個轉換器,以使每個菜單項的新形象:

class PathToImageConverter:IValueConverter 
{ 
    object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string path = "Data/Icons/" + value + ".png"; 
     Image img = new Image {Source = new BitmapImage(new Uri(path, UriKind.Relative))}; 
     return img; 
    } 

    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ""; 
    } 
} 

的XAML:

<MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Icon" Value="{Binding Converter={StaticResource PathToImageConverter1}}"/> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
+0

這在一個特定的場景很好,謝謝。 –