2011-09-03 58 views
1

我在下面給出了一個簡單的標記。 DataContext在運行時分配。帶圖標的數據綁定菜單

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" MinHeight="5" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" MinHeight="5" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" MinWidth="5" /> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" MinWidth="5" /> 
    </Grid.ColumnDefinitions> 

    <Menu Name="GlobalMenu" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"> 
     <Menu.ItemContainerStyle> 
      <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}"> 
       <Setter Property="Header" Value="{Binding Text}" /> 
       <Setter Property="Icon"> 
        <Setter.Value> 
         <Image Source="{Binding Image}" /> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="ItemsSource" Value="{Binding Children}" /> 
      </Style> 
     </Menu.ItemContainerStyle> 
    </Menu> 
</Grid> 

的問題是,菜單項圖標只在第一次drwn。因此,菜單項仍然存在,文本在那裏,我可以通過更改綁定的DataContext對象來更改菜單項文本,所以綁定通常可以工作,但圖標未繪製。由於圖標稍大,我注意到不僅圖標沒有繪製,而且菜單項縮小,就像根本沒有圖標一樣。綁定對象上

圖標屬性看起來像這樣

public BitmapImage Image 
    { 
     get 
     { 
      byte[] image = _widget.CommandRelation.Command.Element.Image; 

      if (image == null) 
      { 
       return null; 
      } 

      BitmapImage bitmapImage = new BitmapImage(); 

      using (MemoryStream stream = new MemoryStream(image)) 
      { 
       bitmapImage.BeginInit(); 
       bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
       bitmapImage.StreamSource = stream; 
       bitmapImage.EndInit(); 
      } 

      return bitmapImage; 
     } 
    } 
+0

一開始就是嘗試調試圖像綁定。在Image綁定上放置一個調試值轉換器,並查看設置了什麼DataContext。 – lbergnehr

+0

由於使用內存流被立即處理,我不確定您將StreamSource設置爲BitmapImage的方式是否正確,這意味着bitmapImage不再需要該流。 –

+0

BitmapImage將不需要流,因爲我設置bitmapImage.CacheOption = BitmapCacheOption.OnLoad; – adontz

回答

3

如果創建一個Style僅對於使用該樣式的所有對象創建一個實例對象,這不會做的UI元素不能在多個地方使用。

你可以把圖片聲明中的一些(編譯)資源字典是從哪裏Style用於訪問(Style.Resources沒有編制,這樣就不幸的是沒有工作),並在其上設置x:Sharedfalse,這樣當您在Setter.Value中通過StaticResource引用它,每次創建一個新實例,並且每個MenuItem都有自己的圖標。

例如試試這個:

<Menu Name="GlobalMenu" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"> 
    <Menu.Resources> 
     <Image x:Key="Icon" x:Shared="False" Source="{Binding Image}" /> 
    </Menu.Resources> 
    <Menu.ItemContainerStyle> 
     <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}"> 
      <Setter Property="Header" Value="{Binding Text}" /> 
      <Setter Property="Icon" Value="{StaticResource Icon}"/> 
      <Setter Property="ItemsSource" Value="{Binding Children}" /> 
     </Style> 
    </Menu.ItemContainerStyle> 
</Menu> 
+0

實際上,所有圖像都是動態的(從文件加載),因此我可能必須在代碼中填充此資源字典,這對我來說有點複雜,因爲我是WPF新手。也許你可以指點我一些文章? – adontz

+0

@adontz:圖像來自唯一的問題是圖像控制無關緊要,您需要擁有多個圖像控件。 –

+0

我的意思是,我不知道如何去做你說的:-) – adontz