2016-01-20 98 views
1

首先我想提一提的是我是C#WPF的新手。 我已经搜索了很多,但到目前为止我还没有找到妥善解决我的问题,我希望现在有人能帮助我。C#WPF ContentPresenter MenuItem TextAlignment

现在我的问题:

我有一个C#WPF应用程序中,我有一个菜单。我正在使用Window.Resoucres区域为x定义新模板:输入MenuItem。 这个工程到目前为止。

但是,我不明白,要将文本居中放在多行(多行)菜单中。

我有一个菜单项和文本“成本概览”。这应该被集中显示在他们自己之间,因为我给菜单固定的宽度。

我想是这样的(只是居中):

Costs 
Overview 

在这里,我,我目前使用的样式模板:

<Style x:Key="MenuItem" TargetType="{x:Type MenuItem}"> 
     <Setter Property="Background" Value="#FF6C6D6E"/> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Setter Property="BorderBrush" Value="{x:Null}"/> 
     <Setter Property="Foreground" Value="White"/> 
     <Setter Property="Cursor" Value="Hand"/> 
     <Setter Property="Width" Value="60"/> 
     <Setter Property="Height" Value="90"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type MenuItem}"> 
        <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="Center" > 
         <Grid> 
          <!-- ContentPresenter to show an Icon --> 
          <ContentPresenter Margin="0,10,0,35" x:Name="Icon" VerticalAlignment="Center" ContentSource="Icon"/> 
          <!-- Content for the menu text etc --> 
          <ContentPresenter Margin="0,55,0,0" VerticalAlignment="Top" HorizontalAlignment="Center" ContentSource="Header" RecognizesAccessKey="True" /> 
         </Grid> 
        </Border> 

        <!-- These triggers re-configure the four arrangements of MenuItem to show different levels of menu via Role --> 
        <ControlTemplate.Triggers> 
         <!-- Role = TopLevelItem : this is a child menu item from the top level without any child items--> 
         <Trigger Property="Role" Value="TopLevelItem"> 
          <Setter Property="Padding" Value="0"/> 
          <Setter Property="BorderBrush" Value="{x:Null}" /> 
          <Setter Property="BorderThickness" Value="0"/> 
          <Setter Property="Width" Value="80" /> 
          <Setter Property="Height" Value="80" /> 
          <Setter Property="HorizontalAlignment" Value="Center" /> 
         </Trigger> 
         <!-- Using colors for the Menu Highlight and IsEnabled--> 
         <Trigger Property="IsHighlighted" Value="true"> 
          <Setter Property="Background" Value="#FF939498" /> 
         </Trigger> 

         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Background" Value="#FF939498" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

这种风格给我的菜单下面的样子。

C# WPF Menu

正如你所看到的,在菜单中的文本不居中。 我已经尝试了一些解决方案,例如在ContentPresenter中设置TextBlock以设置TextAlignment =“Center”属性,但我不知道如何获取TextBlock Binding中的MenuItem文本。

我也尝试将TextBlock.TextAlignment =“Center”属性设置为ContentPresenter,但它也不起作用。


正如你可能看到的,我的菜单有另一个问题。你知道,当我将鼠标悬停在MenuItem上时,我怎样才能消除蓝色焦点?正常的悬停风格是菜单会得到浅灰色,就像按钮的中间一样。另外我的MenuItem不使用菜单的全部宽度...

我期待着每一个想法。

在此先感谢!


SOLUTION

bars22给了我正确的提示..

我忘了,我有一个正常的菜单几行更深。我只是在看的ControlTemplate ...

这里是我的解决方案:

我阔叶从菜单项的风格,因为我做到了,并改变了我的菜单如下:

  <Menu Background="{x:Null}" ItemsSource="{Binding PageViewModels}"> 
       <Menu.ItemsPanel> 
        <ItemsPanelTemplate> 
         <VirtualizingStackPanel Orientation="Vertical"/> 
        </ItemsPanelTemplate> 
       </Menu.ItemsPanel> 
       <Menu.ItemTemplate> 
        <DataTemplate> 
         <MenuItem Icon="{Binding Icon}" 
          Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
          CommandParameter="{Binding }" 
          Style="{StaticResource MenuItem}"> 
          <MenuItem.Header> 
           <StackPanel> 
            <TextBlock TextAlignment="Center" Text="{Binding Name}" /> 
           </StackPanel> 
          </MenuItem.Header> 
         </MenuItem> 
        </DataTemplate> 
       </Menu.ItemTemplate> 
      </Menu> 

回答

1

你可以将内容演示者的容器更改为StackPanel

<StackPanel> 
    <!-- ContentPresenter to show an Icon --> 
    <ContentPresenter x:Name="Icon" ContentSource="Icon"/> 
    <!-- Content for the menu text etc --> 
    <ContentPresenter ContentSource="Header" RecognizesAccessKey="True" /> 
</StackPanel> 

我测试过这些MenuItems。这是两种不同的变体。我认为它看起来不错。

<Menu DockPanel.Dock="Top" Background="white"> 
    <MenuItem Header="Test"> 
     <MenuItem Style="{StaticResource MenuItem}"> 
      <MenuItem.Header> 
       <TextBlock Text="Costs Overview" HorizontalAlignment="Center" TextWrapping="Wrap" /> 
      </MenuItem.Header> 
      <MenuItem.Icon> 
       <Image Source="/WPFTest;component/Images/Test.png" /> 
      </MenuItem.Icon> 
     </MenuItem> 
     <MenuItem Style="{StaticResource MenuItem}"> 
      <MenuItem.Header> 
       <StackPanel> 
        <TextBlock HorizontalAlignment="Center" Text="Costs" /> 
        <TextBlock HorizontalAlignment="Center" Text="Overview" /> 
       </StackPanel> 
      </MenuItem.Header> 
      <MenuItem.Icon> 
       <Image Source="/WPFTest;component/Images/Test.png" /> 
      </MenuItem.Icon> 
     </MenuItem> 
    </MenuItem> 
</Menu> 
+0

OMG ..谢谢..你给了我正确的提示。我忘了我有一个正常的菜单更深的几行。我只是在看ControlTemplate ..很愚蠢......我设置了现在它可以工作.. – Chris

+0

这很好。祝你好运,发展它) – bars222

+0

谢谢..也许你可以帮我解决我的第二个问题?菜单中的蓝色焦点?你知道我可以如何删除它吗? – Chris