2013-05-07 40 views
0

我使用WPF中的菜单创建了一个用户控件。它工作得很好,现在我看到MenuItem.Header的格式问题。基本上,如果我添加一个名称中有一个“_”字符的标题,它会将其删除。例如,如果我将它添加到头文件“Test_Header_Name”,它将显示为“TestHeader_Name”。所以基本上它会格式化/处理字符串并删除第一个“_”字符。我知道事情不会发生在蓝色之外。我确信,我必须在某些时候做些事情来改变格式......但我无法弄清楚它是什么。WPF用户控件中的错误

这里是C#来测试菜单:

public partial class MenuControl : UserControl 
{ 
    public MenuControl() 
    { 
     InitializeComponent(); 
     MenuItem main = new MenuItem(); 
     main.Header = "Sum(Test_Header_Name)"; 
     for (int i = 0; i < 10; i++) 
     { 
      main.Items.Add("Test_" + i); 
     } 
     main.Items.Add(new Separator()); 
     main.Items.Add("Remove"); 
     this.PrincipalMenu.Items.Add(main); 
    } 
} 

这是XAML(这是我认为这正在发生):

<UserControl x:Class="WindowsFormsApplication1.MenuControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="41" d:DesignWidth="380"> 
<UserControl.Resources> 
    <!--************************** 
* STYLE: MenuItem 
************************** --> 
    <SolidColorBrush x:Key="HighlightedBackgroundBrush" Color="#FFDEDEDE" /> 
    <SolidColorBrush x:Key="MenuBackgroundBrush" Color="White" /> 
    <SolidColorBrush x:Key="NormalBorderBrush" Color="#FFE5DFDF" /> 
    <SolidColorBrush x:Key="SolidMenuFontBrush" Color="Black" /> 
    <SolidColorBrush x:Key="HighlightedText" Color="White" /> 
    <SolidColorBrush x:Key="menuItemBrush" Color="#FFB7B7B7" /> 
    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF" /> 
    <SolidColorBrush x:Key="SolidBorderBrush" Color="#888" /> 
    <Style x:Key="{x:Type Menu}" TargetType="{x:Type Menu}"> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     <Setter Property="SnapsToDevicePixels" Value="True"/> 
     <Setter Property="Height" Value="25"/> 
     <Setter Property="Foreground" Value="{StaticResource SolidMenuFontBrush}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Menu}"> 
        <Border 
     Background="{StaticResource MenuBackgroundBrush}" 
     BorderBrush="{StaticResource MenuBackgroundBrush}" 
     BorderThickness="1"> 
         <StackPanel ClipToBounds="True" Orientation="Horizontal" IsItemsHost="True"/> 
        </Border> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type MenuItem}"> 
        <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition x:Name="Col0" MinWidth="17" Width="Auto" SharedSizeGroup="MenuItemIconColumnGroup"/> 
           <ColumnDefinition Width="Auto" SharedSizeGroup="MenuTextColumnGroup"/> 
           <ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIGTColumnGroup"/> 
           <ColumnDefinition x:Name="Col3" Width="14"/> 
          </Grid.ColumnDefinitions> 

          <!-- ContentPresenter to show an Icon if needed --> 
          <ContentPresenter Grid.Column="0" Margin="4,0,6,0" x:Name="Icon" VerticalAlignment="Center" ContentSource="Icon"/> 

          <!-- Glyph is a checkmark if needed for a checkable menu --> 
          <Grid Grid.Column="0" Visibility="Hidden" Margin="4,0,6,0" x:Name="GlyphPanel" VerticalAlignment="Center"> 
           <Path x:Name="GlyphPanelpath" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" Data="M0,2 L0,4.8 L2.5,7.4 L7.1,2.8 L7.1,0 L2.5,4.6 z" FlowDirection="LeftToRight"/> 
          </Grid> 

          <!-- Content for the menu text etc --> 
          <ContentPresenter Grid.Column="1" Margin="{TemplateBinding Padding}" x:Name="HeaderHost" RecognizesAccessKey="True" ContentSource="Header"/> 

          <!-- Content for the menu IGT --> 
          <ContentPresenter Grid.Column="2" Margin="8,1,8,1" x:Name="IGTHost" ContentSource="InputGestureText" VerticalAlignment="Center"/> 

          <!-- Arrow drawn path which points to the next level of the menu --> 
          <Grid Grid.Column="3" Margin="4,0,6,0" x:Name="ArrowPanel" VerticalAlignment="Center"> 
           <Path x:Name="ArrowPanelPath" HorizontalAlignment="Right" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" Data="M0,0 L0,8 L4,4 z"/> 
          </Grid> 
          <!--IsOpen="{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" 
          PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" 
          --> 
          <!-- The Popup is the body of the menu which expands down or across depending on the level of the item --> 
          <Popup Placement="Right" IsOpen="{TemplateBinding IsSubmenuOpen}" x:Name="SubMenuPopup" Focusable="false" PopupAnimation="Fade"> 
           <Border x:Name="SubMenuBorder" SnapsToDevicePixels="True" Background="{StaticResource WindowBackgroundBrush}" BorderBrush="{StaticResource SolidBorderBrush}" BorderThickness="1" Padding="2,2,2,2"> 
            <Grid x:Name="SubMenu" Grid.IsSharedSizeScope="True"> 
             <!--StackPanel holds children of the menu. This is set by IsItemsHost=True--> 
             <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/> 
             <!--<ScrollViewer CanContentScroll="True"> 
              <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" /> 
             </ScrollViewer>--> 
            </Grid> 
           </Border> 
          </Popup> 
         </Grid> 
        </Border> 

        <!-- These triggers re-configure the four arrangements of MenuItem to show different levels of menu via Role --> 
        <ControlTemplate.Triggers> 
         <!-- Role = TopLevelHeader : this is the root menu item in a menu; the Popup expands down        
         2/6/2013 Luis Garcia 
         --> 
         <!--<Trigger Property="Role" Value="TopLevelHeader"> 
          <Setter Property="Padding" Value="6,1,6,1"/> 
          <Setter Property="Placement" Value="Bottom" TargetName="SubMenuPopup"/> 
          <Setter Property="MinWidth" Value="0" TargetName="Col0"/> 
          <Setter Property="Width" Value="Auto" TargetName="Col3"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="Icon"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="GlyphPanel"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="IGTHost"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="ArrowPanel"/> 
         </Trigger>--> 

         <!-- 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="6,1,6,1"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="ArrowPanel"/> 
         </Trigger> 

         <!-- Role = SubMenuHeader : this is a child menu item which does not have children --> 
         <Trigger Property="Role" Value="SubmenuHeader"> 
          <Setter Property="DockPanel.Dock" Value="Top"/> 
          <Setter Property="Padding" Value="0,2,0,2"/> 
         </Trigger> 

         <!-- Role = SubMenuItem : this is a child menu item which has children--> 
         <Trigger Property="Role" Value="SubmenuItem"> 
          <Setter Property="DockPanel.Dock" Value="Top"/> 
          <Setter Property="Padding" Value="0,2,0,2"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="ArrowPanel"/> 
         </Trigger> 

         <Trigger Property="IsSuspendingPopupAnimation" Value="true"> 
          <Setter Property="PopupAnimation" Value="None" TargetName="SubMenuPopup"/> 
         </Trigger> 

         <!-- If no Icon is present the we collapse the Icon Content --> 
         <Trigger Property="Icon" Value="{x:Null}"> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="Icon"/> 
         </Trigger> 

         <!-- The GlyphPanel contains the CheckMark --> 
         <Trigger Property="IsChecked" Value="true"> 
          <Setter Property="Visibility" Value="Visible" TargetName="GlyphPanel"/> 
          <Setter Property="Visibility" Value="Collapsed" TargetName="Icon"/> 
         </Trigger> 

         <!-- Using the system colors for the Menu Highlight and IsEnabled--> 
         <Trigger Property="IsHighlighted" Value="true"> 
          <Setter Property="Background" Value="{StaticResource HighlightedBackgroundBrush}" TargetName="Border"/> 
          <Setter Property="Foreground" Value="{StaticResource HighlightedText}"/> 
          <Setter Property="BorderBrush" Value="{StaticResource NormalBorderBrush}" TargetName="Border"/> 
         </Trigger> 
         <Trigger Property="IsHighlighted" Value="false"> 
          <Setter Property="Background" Value="{StaticResource MenuBackgroundBrush}" TargetName="Border"/> 
          <Setter Property="Foreground" Value="{StaticResource SolidMenuFontBrush}"/> 
          <Setter Property="BorderBrush" Value="{StaticResource MenuBackgroundBrush}" TargetName="Border"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="LightGray"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<UserControl.Foreground> 
    <SolidColorBrush /> 
</UserControl.Foreground> 
<Grid Height="24" Width="250" HorizontalAlignment="Left"> 
    <Grid.Background> 
     <SolidColorBrush /> 
    </Grid.Background> 
    <Menu Name="PrincipalMenu" Margin="0,0,-100,0"> 
    </Menu> 
</Grid> 

任何帮助不胜感激!

+1

它不是一个错误.... http://stackoverflow.com/questions/7861699/can-not-see-underscore-in-wpf-content – Bolu 2013-05-07 15:53:00

回答

5

下划线在WPF内容控件中用作加速键。

因此,将“E_dit”添加到内容控件中会导致在运行时将“d”加下划线。 用户可以按ALT-D将焦点移动到控件上。

在你的情况“Test_Header_Name”它的“H”以下划线为前缀,所以它是加速键。

解决方法是使用两个下划线“__”来停止加速键的添加。

+0

+1 - 知道双下划线会逃脱它。 – 2013-05-07 15:54:54

+0

哎呀,那是一个很好的接...谢谢沃尔特! – 2013-05-07 16:05:57

0

我的猜测是,由于您在Header中使用它,所以第一个下划线将变成MenuItem的AccessKey。因此,在上面的示例中,您的MenuItem可能有AccessKey'h'。有关该主题的更多信息,请参见this answer

我不确定是否有办法重写行为,也许如果您使用ascii代码的下划线或什么的。