2013-08-14 4 views
1

У меня есть очень базовое приложение WPF с сервером MS SQL в качестве источника данных, прикрепленного к нему. Моя DataGrid объявляется следующим образом:WPF DataGrid с RecognizesAccessKey отключен

<DataGrid HorizontalAlignment="Left" Margin="10,88,0,0" VerticalAlignment="Top" Height="456" Width="1018" ItemsSource="{Binding}" /> 

Когда я запустить приложение, я вижу данные, загруженные в сеть из базы данных, но заголовки столбцов выглядят странно. В каждой надписи, которая первоначально содержит символ подчеркивания, удалено это подчеркивание: some_title превращается в sometitle.

Я узнал об этом потому, что подчеркивание распознается как символ управления, чтобы превратить следующий символ в мнемонику.

Как отключить это поведение?

Я выяснил, что это поведение можно обойти, если вы удвоите одиночные символы подчеркивания, то есть some__title вместо some_title. Но поскольку мой источник данных является внешней базой данных, я не могу повлиять на это. Или, может быть, с конвертером?

Я решил, что наилучшим подходом было бы превратить имущество RecognizesAccessKey в false, но, к сожалению, оно каким-то образом недоступно.

Я новичок в WPF, спасибо за помощь!

P.S. Ее картина Snoop (если это поможет) DataGrid snooped

редактировать: моя цель рамки .net 4.5

ответ

3

Лучшее решение, которое я мог придумать перехватывает событие DataGrid AutoGeneratingColumn и заменить все подчеркивает двумя символами подчеркивания, как это:

private void DataGrid_AutoGeneratingColumn_1(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    string header = e.Column.Header.ToString(); 

    // Replace all underscores with two underscores, to prevent AccessKey handling 
    e.Column.Header = header.Replace("_", "__"); 
} 

В моем понимании это (к сожалению) не представляется возможным, чтобы переопределить значение RecognizesAccessKey базового ContentPresenter без переопределения всего шаблона управления. Смотрите эту тему на форумах msdn: How to set RecognizesAccessKey on labels without influencing other parameters?.

1

Вы можете использовать пользовательские столбцы, когда вы используете пользовательский столбец, то вы можете определить столбцы заголовка, как тебе нужно.

+0

Спасибо за ваш ответ. Но для этого подхода потребуется вручную определить все столбцы и его привязки. Однако я мог бы написать функцию, которая автоматически генерирует эти столбцы. Я ищу более общий и декларативный подход. Может быть, с «style» и «setter». – RamboNo5

4

Даже если это старый вопрос, я пришел через решение. Это может помочь кому-то.

<DataGrid HorizontalAlignment="Left" Margin="10,88,0,0" VerticalAlignment="Top" Height="456" Width="1018" ItemsSource="{Binding}" > 
    <DataGrid.ColumnHeaderStyle> 
     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="DataGridColumnHeader"> 
         <Border> 
          <ContentPresenter 
           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           RecognizesAccessKey="False" /> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGrid.ColumnHeaderStyle> 
</DataGrid> 
0

Чтобы добавить к принятому ответ, если вы хотите сохранить оригинальный стиль DataGrid сделать, как показано ниже, и изменить RecognizeAccessKey в ContentPresenter на значение False.

enter image description here

<Style TargetType="{x:Type DataGridColumnHeader}"> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
        <Grid> 
         <Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}"> 
          <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="False" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Themes:DataGridHeaderBorder> 
         <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left"> 
          <Thumb.Style> 
           <Style TargetType="{x:Type Thumb}"> 
            <Setter Property="Width" Value="8"/> 
            <Setter Property="Background" Value="Transparent"/> 
            <Setter Property="Cursor" Value="SizeWE"/> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type Thumb}"> 
               <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </Thumb.Style> 
         </Thumb> 
         <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right"> 
          <Thumb.Style> 
           <Style TargetType="{x:Type Thumb}"> 
            <Setter Property="Width" Value="8"/> 
            <Setter Property="Background" Value="Transparent"/> 
            <Setter Property="Cursor" Value="SizeWE"/> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type Thumb}"> 
               <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </Thumb.Style> 
         </Thumb> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
Смежные вопросы