2015-10-19 237 views
1

标题看起来比首先想到的更容易,但我有一个绑定到项目列表的上下文菜单。我希望能够显示上下文菜单的标题来访问列表。目前它只显示为空白,然后允许我查看列表,但是我需要它显示标题“添加现有属性”。此外,如果有人可以帮助我与我的形象问题,将不胜感激:)。相反,具有图像名称的第一个我想要的显示名称“添加现有属性”上下文菜单的名称标题

<DataTemplate x:Key="AddNodeTemplate"> 
     <Border BorderThickness="1" Background="#F7F7F7"> 
      <Border.BorderBrush> 
       <DrawingBrush Viewport="8,8,8,8" ViewportUnits="Absolute" TileMode="Tile"> 
        <DrawingBrush.Drawing> 
         <DrawingGroup> 
          <GeometryDrawing Brush="#F7F7F7"> 
           <GeometryDrawing.Geometry> 
            <GeometryGroup> 
             <RectangleGeometry Rect="0,0,50,50"/> 
             <RectangleGeometry Rect="50,50,50,50"/> 
            </GeometryGroup> 
           </GeometryDrawing.Geometry> 
          </GeometryDrawing> 
         </DrawingGroup> 
        </DrawingBrush.Drawing> 
       </DrawingBrush> 
      </Border.BorderBrush> 
      <StackPanel> 
       <Button x:Name="ButtonAdd" Click="ButtonAdd_Click" Height="30" Width="130"> 
        <Button.Style> 
         <Style TargetType="Button"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="Button"> 
             <Grid Background="#F7F7F7"> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="25"/> 
               <ColumnDefinition/> 
              </Grid.ColumnDefinitions> 
              <Image Source="Images/icon_plus.bmp" HorizontalAlignment="Left" Margin="5,0,0,0"/> 
              <TextBlock Text="Add Property" HorizontalAlignment="Center" Grid.Column="1" VerticalAlignment="Center" Foreground="LightGray" FontStyle="Italic" FontSize="12"/> 
             </Grid> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
          <Setter Property="Background" Value="#F7F7F7"/> 
         </Style> 
        </Button.Style> 
        <Button.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Add Exisiting Properties" ItemsSource="{Binding Path=AvailableProperties}"> 
            <MenuItem.Resources> 
             <Style TargetType="MenuItem"> 
              <Setter Property="HeaderTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <StackPanel Orientation="Horizontal">                 
                  <ContentPresenter Content="{Binding Name}" /> 
                 </StackPanel> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             <Setter Property="Icon"> 
              <Setter.Value> 
               <DataTemplate> 
                <StackPanel> 
                 <Image Width="12" Height="12" Source="{Binding Icon, Converter={StaticResource ImageToSourceConverter}}" Margin="3" VerticalAlignment="Center"/> 
                </StackPanel> 
               </DataTemplate> 
              </Setter.Value> 
             </Setter> 
            </Style> 
            </MenuItem.Resources> 
          </MenuItem> 
          <MenuItem Header="Upscale well logs"/> 
          <MenuItem Header="Upscale well_top attributes"/> 
          <MenuItem Header="Upscale point attributes"/> 
          <MenuItem Header="Calculate"/> 
         </ContextMenu> 
        </Button.ContextMenu> 
       </Button> 
     </StackPanel> 
     </Border> 
    </DataTemplate> 

什么是显示

enter image description here

回答

2

这种风格<Style TargetType="MenuItem">其实适用于顶级菜单项(您hardcodedly设置其HeaderAdd Exisiting Properties的一个)。您需要使用Trigger根据Role属性过滤掉。所有的子菜单项有SubMenuItemRole,所以它应该是这样的:

<Style TargetType="MenuItem"> 
    <Style.Triggers> 
     <Trigger Property="Role" Value="SubMenuItem"> 
      <Setter Property="HeaderTemplate"> 
        <Setter.Value> 
          <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <ContentPresenter Content="{Binding Name}"/> 
          </StackPanel> 
          </DataTemplate> 
        </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
    <!-- ... --> 
</Style>   

编辑:关于图标,您明确将其设置为未渲染的DataTemplate,而是使用了字符串由ToString()返回(因此文本System.Windows.DataTemplate代替图标)。你可以仅仅删除DataTemplate这样的:

<!-- define a non-shared resource of Image --> 
<Style TargetType="MenuItem"> 
    <Style.Resources> 
     <Image x:Key="img" x:Shared="False" Width="12" Height="12" Source="{Binding Icon, Converter={StaticResource ImageToSourceConverter}}" 
      Margin="3" VerticalAlignment="Center"/> 
    </Style.Resources> 
    <!-- ... --> 
</Style> 

<Setter Property="Icon" Value="{StaticResource img}"/> 

最终的解决方案:

<Style TargetType="MenuItem"> 
    <Style.Resources> 
     <Style TargetType="ContentPresenter"> 
       <Style.Triggers> 
        <Trigger Property="ContentSource" Value="Icon"> 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <Image Source="{Binding}"/> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
        </Trigger> 
       </Style.Triggers> 
     </Style> 
    </Style.Resources>  
    <Setter Property="Icon" Value="{Binding Icon, 
      Converter={StaticResource ImageToSourceConverter}}"/> 
    <!-- ... --> 
</Style>   
+0

谢谢你是完美的:),你知道如何解决我的图像问题吗? –

+0

@RyanArchibald看到我的编辑。 –

+0

谢谢,它已经工作,但仅用于我的上下文菜单列表中的最后一项,你知道为什么吗? –

0

您可以使用 `

<MenuItem Header="Add Exisiting Properties" ItemsSource="{Binding Path=AvailableProperties}"> 
    <MenuItem.Resources> 
     <Style TargetType="MenuItem"> 
     <Setter Property="HeaderTemplate"> 
       <Setter.Value> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal">                 
<ContentPresenter Content="{TemplateBinding Header}" /> 
        </StackPanel> 
       </DataTemplate> 
       </Setter.Value> 
     </Setter> 

or

<MenuItem Header="Add Exisiting Properties" ItemsSource="{Binding Path=AvailableProperties}"> 
      <MenuItem.Resources> 
       <Style TargetType="MenuItem"> 
       <Setter Property="HeaderTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
         <StackPanel Orientation="Horizontal">                  
    <ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Header}" /> 
         </StackPanel> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 

`

+0

你的第二个建议作出给我清空了他们:(,但是第一个,我得到一个错误只是现在头部无法识别或无法访问 –