Chcę zmienić kolor tła nagłówka Datagrid w Silverlight.Zmień kolor tła nagłówka Datagrid w Silverlight
Odpowiedz
Mimo że DataGrid nie eksponuje właściwości tła nagłówka, ma właściwość dla ColumnHeaderStyle. Korzystając z techniki, którą DaniCE zaproponował wcześniej dla pojedynczej kolumny, możemy zastąpić szablon nagłówka dla wszystkich kolumn nagłówka, w tym pustego miejsca po prawej stronie. Wadą z zastąpieniem całego szablonu dla nagłówka jest to, że tracimy strzałki sortowania i separatory, które są obecne w domyślnym szablonie nagłówka. Na szczęście możemy użyć template browser, aby wyodrębnić domyślny używany szablon, a następnie zmodyfikować jego kopię.
Poniżej przedstawiam szybki przykład, który zmieni tło nagłówków kolumn na LightBlue, zachowując separatory i sortowanie. Spójrz na domyślny szablon DataGridColumnHeader w postaci template browser, aby zobaczyć, jak radzić sobie z modyfikowaniem tła, gdy mysz unosi się nad ColumnHeader.
DataGrid Header Background http://i34.tinypic.com/2q2ixch.jpg
<data:DataGrid x:Name="grid">
<data:DataGrid.ColumnHeaderStyle>
<Style
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
TargetType="primitives:DataGridColumnHeader" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="primitives:DataGridColumnHeader">
<Grid Name="Root">
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="SortStates" >
<vsm:VisualStateGroup.Transitions>
<vsm:VisualTransition GeneratedDuration="00:00:0.1" />
</vsm:VisualStateGroup.Transitions>
<vsm:VisualState x:Name="Unsorted" />
<vsm:VisualState x:Name="SortAscending">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0" />
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name="SortDescending">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0" />
<DoubleAnimation Storyboard.TargetName="SortIconTransform" Storyboard.TargetProperty="ScaleY" Duration="0" To="-.9" />
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Rectangle x:Name="BackgroundRectangle" Stretch="Fill" Fill="LightBlue" Grid.ColumnSpan="2" Grid.RowSpan="2" />
<ContentPresenter Grid.RowSpan="2" Content="{TemplateBinding Content}" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" />
<Rectangle Name="VerticalSeparator" Grid.RowSpan="2" Grid.Column="2" Width="1" VerticalAlignment="Stretch" Fill="{TemplateBinding SeparatorBrush}" Visibility="{TemplateBinding SeparatorVisibility}" />
<Path Grid.RowSpan="2" Name="SortIcon" RenderTransformOrigin=".5,.5" HorizontalAlignment="Left" VerticalAlignment="Center" Opacity="0" Grid.Column="1" Stretch="Uniform" Width="8" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z ">
<Path.Fill>
<SolidColorBrush Color="#FF444444" />
</Path.Fill>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="SortIconTransform" ScaleX=".9" ScaleY=".9" />
</TransformGroup>
</Path.RenderTransform>
</Path>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</data:DataGrid.ColumnHeaderStyle>
</data:DataGrid>
Nadzieja to pomaga!
Wymyśliłem rozwiązanie "Czyste". Mam nadzieję, że to rozwiązanie dla Ciebie. Po prostu przesłonię DataGrid i odsłoniłem metodę GetTemplateChild. Stosując je można uzyskać dostęp do DataGridColumnHeaderPresenter i DataGridColumnHeaders zawartych w nim ...
1) Zastąp DataGrid
/// <summary>
/// Extends the DataGrid so that it's possible to access the template objects
/// </summary>
public class DataGridEx : System.Windows.Controls.DataGrid
{
/// <summary>
/// Exposes Template items
/// </summary>
public Object GetTemplateObject(String name)
{
return this.GetTemplateChild(name);
}
}
2) zmienić tło
DataGridEx siatkę = new DataGridEx();
... po nakłada się szablon ...
DataGridColumnHeadersPresenter obj = DataGrid.GetTemplateObject ("ColumnHeadersPresenter") jako DataGridColumnHeadersPresenter;
DataGridColumnHeader h = obj.Children [0] as DataGridColumnHeader;
h.Background = nowy SolidColorBrush (Colors.Red);
To było bardzo pomocne, David! – ScottG
Niestety to nie wyśrodkowuje tekstu nagłówka .. mimo że próbowałem wszystkiego – user1034912