2013-05-07 105 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代碼的下劃線或什麼的。