2015-03-17 9 views
5

więc mam Context Menu I MenuItem w nim, która wybucha na listę nazwisk:Jak ustawić ikonę w MenuItem ContextMenu podczas używania ItemContainerStyle

<ContextMenu> 
    <MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}"> 
     <MenuItem.ItemContainerStyle> 
      <Style TargetType="MenuItem"> 
       <Setter Property="Header" Value={Binding Name}/> 
       <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.DoSomething}" /> 
       <Setter Property="CommandParameter" Value="{Binding }" /> 
      </Style> 
     </MenuItem.ItemContainerStyle> 
    </MenuItem> 
</ContextMenu> 

Teraz powyższy kod działa plik i wyświetla Moje strony lista nazwisk. Teraz chciałbym dodać ikonę obok każdej nazwy przy użyciu opakowania URI .. Więc z this question widzę, że najlepszym sposobem na to jest do szablonu z Header więc próbowałem to pierwszy jak pytanie

<ContextMenu> 
    <MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}"> 
     <MenuItem.ItemContainerStyle> 
      <Style TargetType="MenuItem"> 
       <Setter Property="Header"> 
        <Setter.Value> 
         <StackPanel> 
           <Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" /> 
           <ContentPresenter Content="{Binding Name}" /> 
          </StackPanel> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.DoSomething}" /> 
       <Setter Property="CommandParameter" Value="{Binding }" /> 
      </Style> 
     </MenuItem.ItemContainerStyle> 
    </MenuItem> 
</ContextMenu> 

ale to dało mi błąd:

Specified element is already the logical child of another element. Disconnect it first.

Więc po pewnym badań próbowałem:

<ContextMenu> 
    <MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}"> 
     <MenuItem.ItemContainerStyle> 
      <Style TargetType="MenuItem"> 
       <Setter Property="Header"> 
        <Setter.Value> 
         <ControlTemplate> 
          <StackPanel> 
            <Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" /> 
            <ContentPresenter Content="{Binding Name}" /> 
           </StackPanel> 
          </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.DoSomething}" /> 
       <Setter Property="CommandParameter" Value="{Binding }" /> 
      </Style> 
     </MenuItem.ItemContainerStyle> 
    </MenuItem> 
</ContextMenu> 

ale teraz wszystkie moje imiona są ControlTemplate i ikona nie jest wyświetlacz ed ...

Jak dodać ikonę do elementu menu Menu kontekstowe poprzez ItemContainerStyle?

EDIT

Próbowałem:

<Setter Property="Header" Value="{Binding Name}"/> 
    <Setter Property="Icon"> 
     <Setter.Value> 
      <Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" /> 
     </Setter.Value> 
    </Setter> 

I dostać ikonę renderingu ale tylko dla ostatniego elementu w moim menu?

+0

Albo użyć 'HeaderTemplate' zamiast' Header' i używać 'DataTemplate' zamiast' ControlTemplate' ale osobiście chciałbym ustawić właściwość '' Icon' jako kolejny Setter' w 'Style'. Twój kod umieści ikonę w części zawartości 'MenuItem', a nie' Icon' part – dkozl

+0

@dkozl masz rację używając 'HeaderTemplate' i' DataTemplate' działa. I miałeś rację, ponieważ mój kod umieścił ikonę w nagłówku, co nie było tym, co zaplanowałem. Czy wiesz, jak ustawić ikonę przy użyciu URI Paczki w stylu? – user1

+0

spróbuj ustawić ['x: Shared'] (https://msdn.microsoft.com/en-us/library/aa970778 (v = vs.110) .aspx) na false w stosunku do twojego stylu" like "