2013-05-07 2 views
0

WPF에서 메뉴를 사용하여 사용자 정의 컨트롤을 만들었습니다. 괜찮 았는데 지금은 MenuItem.Header 형식 문제가 나타납니다. 기본적으로 이름에 "_"문자가있는 헤더를 추가하면 삭제됩니다. 예를 들어, 헤더에 "Test_Header_Name"을 추가하면 "TestHeader_Name"으로 표시됩니다. 그래서 기본적으로 문자열을 형식화/조작하고 첫 번째 "_"문자를 삭제합니다. 나는 일이 파란에서 다만 일어나지 않는다는 것을 알고있다. 나는 어떤 점에서 형식을 바꾸기 위해 무언가를했을 것임에 틀림 없다. 그러나 그것이 무엇인지 알 수 없다. (나는 그것이 일어나고 생각하는 곳입니다)WPF 사용자 컨트롤의 버그

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입니다 : 여기

메뉴를 테스트하는 C#을

<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

답변

5

밑줄은 WPF 콘텐츠 컨트롤에서 가속 키로 사용됩니다.

콘텐츠 컨트롤에 "E_dit"을 추가하면 런타임에 "d"에 밑줄이 그어집니다. 사용자는 ALT-D를 눌러 컨트롤에 포커스를 이동할 수 있습니다.

"Test_Header_Name"의 경우 "H"는 밑줄로 표시되어 액셀러레이터 키입니다.

해결책은 액셀러레이터 키 추가를 중지하기 위해 두 개의 밑줄 "__"을 사용하는 것입니다.

+0

+1 - 이중 밑줄이 그것을 벗어날 것이라는 것을 알고 있기 때문에. –

+0

이런, 좋은 캐치 ... 고마워 월트! –

0

내 생각 엔 Header에 처음 사용하기 때문에 첫 번째 밑줄이 MenuItem의 AccessKey로 바뀌었을 것입니다. 위의 예에서 MenuItem의 경우 'AccessKey'을 'h'로 설정했을 수 있습니다. 주제에 대한 자세한 내용은 this answer을 참조하십시오.

어쩌면 밑줄이나 다른 것에 ASCII 코드를 사용하는 경우 동작을 재정의 할 방법이 있는지 확실하지 않습니다.

관련 문제