2010-12-09 4 views
4

메뉴 가져 오기 메뉴 항목 아이콘은 마지막 menuItem에만 나타납니다. 만약 내가 모든 MenuItems 아이콘에있는 이미지를 가지고 디버그하는 동안 나는 단지 마지막 menuItem 아이콘에 이미지가 있습니다 스눕 애플 리케이션. 또한 submenuItem을 추가하면 menuItem의 아이콘이 사라지고 일단 하위 메뉴가 열리고 마지막 하위 메뉴가 아이콘이됩니다 ... 어떤 생각입니까? 추신 : 메뉴 항목에 대한 툴팁도 작동하지 않습니다. caliburn 마이크로 및 유창한 리본 컨트롤을 사용하고 있습니다.WPF - MenuItem 누락 아이콘/이미지

 <ControlTemplate x:Key="dropDownButton"> 
     <ef:DropDownButton Header="{Binding DisplayName}" 
          ItemsSource="{Binding Items}" 
          LargeIcon="{Binding LargeIconPath}" 
          cm:Message.Attach="ClickAction()" 
          ef:KeyTip.Keys="{Binding KeyTip}"> 
      <ef:DropDownButton.ItemContainerStyle> 
       <Style TargetType="MenuItem"> 
        <Setter Property="Header" 
          Value="{Binding DisplayName}"/> 
        <Setter Property="Icon"> 
         <Setter.Value> 
          <Image Source="{Binding Path=IconPath}"/> 
         </Setter.Value> 
        </Setter> 
        <Setter Property="ItemsSource" 
          Value="{Binding Items}"/> 
        <Setter Property="cm:Message.Attach" 
          Value="ClickAction()"/> 
        <Setter Property="ef:KeyTip.Keys" 
          Value="{Binding KeyTip}"/> 
        <Setter Property="ToolTip"> 
         <Setter.Value> 
          <ef:ScreenTip Title="{Binding DisplayName}" 
              HelpTopic="ScreenTip help ..." 
              Image="{Binding LargeIconPath}" 
              Text="Text for ScreenTip"/> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ef:DropDownButton.ItemContainerStyle> 
      <ef:DropDownButton.ToolTip> 
       <ef:ScreenTip Title="{Binding DisplayName}" 
           HelpTopic="ScreenTip help ..." 
           Image="{Binding LargeIconPath}" 
           Text="Text for ScreenTip"/> 
      </ef:DropDownButton.ToolTip> 
     </ef:DropDownButton> 
+1

IMHO 비슷한 주제에 대한 해결책 : "http://stackoverflow.com/questions/6177550/menuitem-style-with-icon-creates-only-one-icon"이 더 좋습니다. –

답변

7

당신은 StyleImage 제어 Icon 속성을 설정합니다. 이제 Style 복사본이 하나만 생성되므로 Image 복사본이 하나만 만들어집니다. 이제 모든 컨트롤은 한 번에 부모를 하나만 가질 수 있습니다. 따라서 마지막으로 MenuItem에 할당되면 이전 MenuItem 컨트롤에서 제거됩니다. 이 문제를 해결하려면 Templates을 사용하십시오. 대신 Header 속성을 설정

HeaderTemplate을 설정

  <Setter Property="HeaderTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Image Grid.Column="0" 
            Source="{Binding Path=IconPath}" /> 
          <TextBlock Grid.Column="1" 
             Text="{Binding DisplayName}" /> 
         </Grid> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 

내가 속성을 사용하는 컨트롤 툴킷에 의해 노출되는 것의 확실하지 않다. 하지만 템플릿 속성이 있어야합니다.

이렇게하면 Icon 속성을 스타일로 설정할 필요가 없습니다. 이 같은

+0

을 사용해 보았습니다. 아직 명확하지 않습니다. 오류 : 'System.Windows.Controls.Grid'는 Setter의 'System.Windows.Controls.HeaderedContentControl.HeaderTemplate'속성에 유효한 값이 아닙니다. – no9

+0

내 실수. 당신은'DataTemplate'에서 그것을 포장해야합니다. – decyclone

0

작품 :

 <DataTemplate x:Key="MenuItemHeaderTemplate"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Image Grid.Column="0" Source="{Binding Path=IconPath}" /> 
      <Label Grid.Column="1" Content="{Binding DisplayName}" />    
     </Grid> 
    </DataTemplate> 


    <ControlTemplate x:Key="dropDownButton"> 
     <ef:DropDownButton Header="{Binding DisplayName}" 
          ItemsSource="{Binding Items}" 
          LargeIcon="{Binding LargeIconPath}" 
          cm:Message.Attach="ClickAction()" 
          ef:KeyTip.Keys="{Binding KeyTip}"> 
      <ef:DropDownButton.ItemContainerStyle> 
       <Style TargetType="MenuItem"> 
        <Setter Property="HeaderTemplate" Value="{StaticResource MenuItemHeaderTemplate}" />         
        <Setter Property="ItemsSource" 
          Value="{Binding Items}"/> 
        <Setter Property="cm:Message.Attach" 
          Value="ClickAction()"/> 
        <Setter Property="ef:KeyTip.Keys" 
          Value="{Binding KeyTip}"/> 
        <Setter Property="ToolTip"> 
         <Setter.Value> 
          <ef:ScreenTip Title="{Binding DisplayName}" 
              HelpTopic="ScreenTip help ..." 
              Image="{Binding LargeIconPath}" 
              Text="Text for ScreenTip"/> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ef:DropDownButton.ItemContainerStyle> 
      <ef:DropDownButton.ToolTip> 
       <ef:ScreenTip Title="{Binding DisplayName}" 
           HelpTopic="ScreenTip help ..." 
           Image="{Binding LargeIconPath}" 
           Text="Text for ScreenTip"/> 
      </ef:DropDownButton.ToolTip> 
     </ef:DropDownButton> 
0

내가 성공적으로있는 ResourceDictionary에 다음 항목을 사용 :

<!-- Define non-shared image to avoid loss of menu icons --> 
<Image x:Key="MenuIconImage" Height="16" Width="16" x:Shared="false"> 
    <Image.Source> 
     <DrawingImage Drawing="{Binding Icon}" /> 
    </Image.Source> 
</Image> 

<Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}"> 
    <Setter Property="Header" Value="{Binding DisplayName /> 
    <Setter Property="Icon" Value="{StaticResource MenuIconImage}" /> 
</Style> 
0

을 어떤 이유로 접근을 위해 이미지 X 정적 자원이있을 때 : 공유 = false로하지 않습니다 나를 위해 일해. 마지막 메뉴 항목 만 아이콘을 표시합니다. 나는 StaticResource와 DynamicResource를 모두 시도했다. 여기 내 솔루션입니다 :

public class MenuItemIconHelper 
{ 
    #region ImageSource Icon 

    public static readonly DependencyProperty IconProperty = DependencyProperty.RegisterAttached("Icon", typeof(ImageSource), typeof(MenuItemIconHelper), new PropertyMetadata(default(ImageSource), IconPropertyChangedCallback)); 

    private static void IconPropertyChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var i = (MenuItem)obj; 

     if (e.NewValue != null) 
      i.Icon = new Image() {Source = (ImageSource)e.NewValue}; 
     else 
      i.Icon = null; 
    } 

    public static void SetIcon(DependencyObject element, ImageSource value) 
    { 
     element.SetValue(IconProperty, value); 
    } 

    public static ImageSource GetIcon(DependencyObject element) 
    { 
     return (ImageSource)element.GetValue(IconProperty); 
    } 

    #endregion 
} 

샘플 :

<Style x:Key="CommandMenuItemStyle" TargetType="MenuItem"> 
<Setter Property="cb:MenuItemIconHelper.Icon" Value="car1.png" /> 
<Setter Property="Header" Value="{Binding Name}" /> 

내가 리소스를 사용하는 것보다 더 읽을 수 그것을 고려하고 MenuItem의의는 HeaderTemplate을 변경할 필요가 없습니다. ImageSource 또는 Image에 대한 일부 캐싱 메커니즘을 구현할 수도 있습니다.

관련 문제