2017-02-21 55 views
1

У меня есть datagrid в моем программном обеспечении. На этом показан ряд результатов. Мы используем стили XAML для их форматирования с помощью стилей и триггеров данных для особого поведения.WPF: Как изменить свойства столбца datagrid, когда мышь находится над заголовком столбца?

Моя цель: когда я перехожу через заголовок столбца, я хочу, чтобы ячейка заголовка и все ячейки столбца получили границу справа (или тот же фоновый цвет в порядке).

Как я могу получить этот результат?

На данный момент, со следующим стилем, я получаю курсор работает над заголовком:

<Style x:Key="DataGridColumnHeaderGroups" TargetType="{x:Type DataGridColumnHeader}"> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="FontFamily" Value="{StaticResource SourceSansPro-Bold}" /> 
    <Setter Property="Height" Value="35" /> 
    <Setter Property="Background" Value="{StaticResource White}" /> 
    <Setter Property="SeparatorBrush" Value="{StaticResource Gray}" /> 
    <Setter Property="SeparatorVisibility" Value="Visible" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
       <Grid x:Name="topGrid"> 
        <themes:DataGridHeaderBorder Background="{TemplateBinding Background}" 
               BorderBrush="{TemplateBinding BorderBrush}" 
               BorderThickness="{TemplateBinding BorderThickness}" 
               IsClickable="{TemplateBinding CanUserSort}" 
               IsHovered="{TemplateBinding IsMouseOver}" 
               IsPressed="{TemplateBinding IsPressed}" 
               Padding="{TemplateBinding Padding}" 
               SeparatorBrush="{TemplateBinding SeparatorBrush}" 
               SeparatorVisibility="{TemplateBinding SeparatorVisibility}" 
               SortDirection="{TemplateBinding SortDirection}"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <ContentPresenter Grid.Column="0" 
               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
               SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
          <Path x:Name="SortArrow" 
            Grid.Column="1" 
            Width="8" 
            Height="6" 
            Margin="2,0,5,0" 
            HorizontalAlignment="Right" 
            VerticalAlignment="Center" 
            Data="M0,0 L1,0 0.5,1 z" 
            Fill="Black" 
            Opacity="0.5" 
            RenderTransformOrigin="0.5,0.4" 
            Stretch="Fill" 
            Visibility="Collapsed" /> 
         </Grid> 
        </themes:DataGridHeaderBorder> 
        <Thumb x:Name="PART_LeftHeaderGripper" 
          HorizontalAlignment="Left" 
          Style="{StaticResource ColumnHeaderGripperStyle}" /> 
        <Thumb x:Name="PART_RightHeaderGripper" 
          HorizontalAlignment="Right" 
          Style="{StaticResource ColumnHeaderGripperStyle}" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="SortDirection" Value="Ascending"> 
         <Setter TargetName="SortArrow" Property="Visibility" Value="Visible" /> 
         <Setter TargetName="SortArrow" Property="RenderTransform"> 
          <Setter.Value> 
           <RotateTransform Angle="180" /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="SortDirection" Value="Descending"> 
         <Setter TargetName="SortArrow" Property="Visibility" Value="Visible" /> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Red" /> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="False"> 
         <Setter Property="Background" Value="GreenYellow" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я также следующий стиль для клеток, но они действуют по строкам, а не столбец как Я хотел бы иметь:

<Style x:Key="DataGridCellGroups" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="MinHeight" Value="35" /> 
    <Setter Property="VerticalAlignment" Value="Stretch" /> 
    <Setter Property="VerticalContentAlignment" Value="Top" /> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    <Setter Property="Padding" Value="7" /> 
    <Setter Property="BorderThickness" Value="0 0 3 0" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         SnapsToDevicePixels="True"> 
        <ContentPresenter Margin="5,8,10,8" 
             VerticalAlignment="Top" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{StaticResource Grid Selected Row}" /> 
      <Setter Property="Foreground" Value="{StaticResource Gray Darker}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Как я могу установить фон колонки, со стилями, когда IsMousover = true в заголовке?

EDIT: У нас есть следующие ограничения: Работа со стилем, распространение фонового рисунка мыши для всех ячеек столбцов, когда мышь над заголовком столбца.

ответ

0

Как насчет обработки AutoGeneratingColumn?

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     var header = new DataGridColumnHeader() { Content = e.PropertyName }; ; 
     e.Column.Header = header; 
     header.MouseEnter += Header_MouseEnter; 
     header.MouseLeave += Header_MouseLeave; 

    } 

    private void Header_MouseLeave(object sender, MouseEventArgs e) 
    { 
     ((DataGridColumnHeader)sender).Column.CellStyle = null; 
    } 

    private void Header_MouseEnter(object sender, MouseEventArgs e) 
    { 
     ((DataGridColumnHeader)sender).Column.CellStyle = TryFindResource("cellStyle") as Style; 
    } 

и Xaml:

<Window.Resources> 
    <Style TargetType="DataGridCell" x:Key="cellStyle"> 
     <Setter Property="Background" Value="LightBlue"/> 
    </Style> 
</Window.Resources> 

<DataGrid DataContext="{Binding}" ItemsSource="{Binding Models}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" /> 
+0

HI, У нас есть различные стили на другом столбце и работать со стилями, как у нас есть много таких сеток. Мы предусмотрели пользовательский контроль, но для нас это слишком завышено. Поэтому мы стараемся работать со Стили. Кроме того, ваше решение для обработки события в заголовке в порядке, но мы его уже получили и не распространяем фон/границу на все ячейки столбца – DRK

+0

привет, как установить источник itemsdatagrid? – Ron