2016-01-20 97 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