2015-01-10 1 views
0

Как изменить стиль индикатора разделителя столбцов столбца ListView? (Синяя линия, которая появляется при попытке изменить порядок столбца, на фото ниже)Как изменить стиль индикатора разделителя столбцов столбца ListView?

enter image description here

Следующая странно меняется только высота:

<ListView> 
    <ListView.Resources> 
     <Style TargetType="{x:Type Separator}"> 
      <Setter Property="Height" 
        Value="5" /> 
      <Setter Property="Foreground" 
        Value="Red" /> 
      <Setter Property="Background" 
        Value="Red" /> 
     </Style> 
    </ListView.Resources> 
    <ListView.View> 
     <GridView > 
      <GridViewColumn Header="First Name" 
          Width="100" /> 
      <GridViewColumn Header="Last Name" 
          Width="100" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

Я попытался кучу вещей, в том числе

  • Установка SeparatorStyleKey (панель инструментов, MenuItem, StatusBar)
  • Переопределение Сист emColors

но не повезло.

+0

Я думаю, что разделитель является Thumb. Попробуйте изменить стиль управления Thumb. – MDoobie

+0

Кажется, не имеет значения – pastillman

ответ

0

Ну, это немного сложно ... Для этого вам нужно создать стиль для Большого пальца.

Например (извлеченный стиль по умолчанию, используя смесь):

<Style x:Key="GridViewColumnHeaderGripper" TargetType="{x:Type Thumb}"> 
     <Setter Property="Canvas.Right" Value="-9"/> 
     <Setter Property="Width" Value="18"/> 
     <Setter Property="Height" Value="{Binding ActualHeight, RelativeSource={RelativeSource TemplatedParent}}"/> 
     <Setter Property="Padding" Value="0"/> 
     <Setter Property="Background" Value="{StaticResource GridViewColumnHeaderBorderBackground}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Thumb}"> 
        <Border Background="Transparent" Padding="{TemplateBinding Padding}"> 
         <Rectangle Fill="{TemplateBinding Background}" HorizontalAlignment="Center" Width="1"/> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Затем вы должны создать GridViewColumnHeaderStyle. Например (. Извлеченной стиль по умолчанию, используя Blend, я удалил некоторые триггеры для простоты):

 <Style x:Key="GridViewColumnHeaderStyle1" TargetType="{x:Type GridViewColumnHeader}"> 
     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <Setter Property="Background" Value="{StaticResource GridViewColumnHeaderBackground}"/> 
     <Setter Property="BorderBrush" Value="{StaticResource GridViewColumnHeaderBorderBackground}"/> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Setter Property="Padding" Value="2,0,2,0"/> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GridViewColumnHeader}"> 
        <Grid SnapsToDevicePixels="true"> 
         <Border x:Name="HeaderBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,1,0,1" Background="{TemplateBinding Background}"> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition MaxHeight="7"/> 
            <RowDefinition/> 
           </Grid.RowDefinitions> 
           <Rectangle x:Name="UpperHighlight" Fill="#FFE3F7FF" Visibility="Collapsed"/> 
           <Border Padding="{TemplateBinding Padding}" Grid.RowSpan="2"> 
            <ContentPresenter x:Name="HeaderContent" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="0,0,0,1" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
           </Border> 
          </Grid> 
         </Border> 
         <Border x:Name="HeaderHoverBorder" BorderThickness="1,0,1,1" Margin="1,1,0,0"/> 
         <Border x:Name="HeaderPressBorder" BorderThickness="1,1,1,0" Margin="1,0,0,1"/> 
         <Canvas> 
          <Thumb x:Name="PART_HeaderGripper" Style="{StaticResource GridViewColumnHeaderGripper}"/> 
         </Canvas> 
        </Grid> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

Конечно, в этих стилях, вы можете изменить все, что вы хотите. Вероятно, вы должны, потому что это только стили по умолчанию, о которых я уже говорил.

0

Так получилось, что шаблон на самом деле жестко закодирован. См. Исходный код для GridViewHeaderRowPresenter. AddIndicator() представлен ниже

// Create the indicator for column re-ordering 
    private void AddIndicator() 
    { 
     Separator indicator = new Separator(); 
     indicator.Visibility = Visibility.Hidden; 

     // Indicator style: 
     // 
     // <Setter Property="Margin" Value="0" /> 
     // <Setter Property="Width" Value="2" /> 
     // <Setter Property="Template"> 
     // <Setter.Value> 
     //  <ControlTemplate TargetType="{x:Type Separator}"> 
     //  <Border Background="#FF000080"/> 
     //  </ControlTemplate> 
     // </Setter.Value> 
     // </Setter> 

     indicator.Margin = new Thickness(0); 
     indicator.Width = 2.0; 

     FrameworkElementFactory border = new FrameworkElementFactory(typeof(Border)); 
     border.SetValue(Border.BackgroundProperty, new SolidColorBrush(Color.FromUInt32(0xFF000080))); 

     ControlTemplate template = new ControlTemplate(typeof(Separator)); 
     template.VisualTree = border; 
     template.Seal(); 

     indicator.Template = template; 

     InternalChildren.AddInternal(indicator); 
     _indicator = indicator; 
    } 

здесь есть обходной путь я (который может быть легко превращен в прикрепленной собственность)

void ListView_Loaded(object sender, RoutedEventArgs e) 
    { 
     var listView = sender as ListView; 
     if (listView != null) 
     { 
      var gvhrp = FindFirstVisual<GridViewHeaderRowPresenter>(listView); 
      if (gvhrp != null) 
      { 
       var separator = FindFirstVisual<Separator>(gvhrp); 
       if (separator != null) 
       { 
        separator.IsVisibleChanged += delegate 
        { 
         var border = FindFirstVisual<Border>(separator); 
         if (border != null) 
         { 
          border.Background = Brushes.Red; 
         } 
        }; 
       } 
      } 
     } 
    } 

    T FindFirstVisual<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        return (T)child; 
       } 

       var result = FindFirstVisual<T>(child); 
       if (result != null) 
       { 
        return result; 
       } 
      } 
     } 

     return null; 
    }