WPF - DataGrid "inline" 样式重置基本模板
WPF - DataGrid "inline" style resets base template
我有一个相当复杂的应用程序,所以我使用 ResourceDictionary 来管理我的所有样式等等。在那里我为 DataGridColumnHeaderBaseStyle 定义了一个样式:
<Style x:Key="DataGridColumnHeaderBaseStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="{StaticResource TableHeaderBackgroundColor}" />
<Setter Property="BorderBrush" Value="{StaticResource GridLinesColor}" />
<Setter Property="BorderThickness" Value="0,0,1,1" />
<Setter Property="Padding" Value="{DynamicResource HeaderPadding}" />
<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}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Path x:Name="SortArrow" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" Width="8" Height="6"
Margin="3,0,0,0" Stretch="Fill" Opacity="0.5" Fill="White" RenderTransformOrigin="0.5,0.4" Visibility="Collapsed"
Data="M0,0 L1,0 0.5,1 z" />
</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>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{StaticResource DisabledTableHeaderBackgroundColor}" />
<Setter Property="BorderBrush" Value="{StaticResource DisabledGridLinesColor}" />
</Trigger>
</Style.Triggers>
</Style>
到目前为止一切顺利。在我的主应用程序中,我有一个加载该样式的 DataGrid。问题是当我为工具提示添加 Setter 时,我丢失了该列的样式模板。
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding Number}" IsReadOnly="True" />
<DataGridComboBoxColumn Header="Region" ItemsSource="{Binding Kiln.Regions, Source={StaticResource MainViewModel}}"
SelectedValueBinding="{Binding RegionNumber}" SelectedValuePath="Number" DisplayMemberPath="Name"
EditingElementStyle="{StaticResource EditingComboBoxStyle}" />
<DataGridCheckBoxColumn Header="Has Mixture" Binding="{Binding HasMixture}" />
<DataGridCheckBoxColumn Header="Has Burners" Binding="{Binding HasBurners}" />
<DataGridTextColumn Header="Burners/Circuits" Binding="{Binding CircuitBurnersNumber}" />
<DataGridTextColumn Header="GP ⌀" Binding="{Binding GasPipeDiameter}" >
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="ToolTip" Value="Gas Pipe ⌀ (mm)" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Gas Orifice ⌀ (mm)" Binding="{Binding GasOrificeDiameter}" />
<DataGridTextColumn Header="Air Pipe ⌀ (mm)" Binding="{Binding AirPipeDiameter}" />
<DataGridTextColumn Header="Air Orifice ⌀ (mm)" Binding="{Binding AirOrificeDiameter}" />
</DataGrid.Columns>
添加忽略样式的其余部分。我错过了什么?有解决此问题的提示吗?
在这里你可以看到我所说的行为。提前致谢。
新样式应从基本样式派生,使用 BasedOn
属性:
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader"
BasedOn="{StaticResource DataGridColumnHeaderBaseStyle}">
<Setter Property="ToolTip" Value="Gas Pipe ⌀ (mm)" />
</Style>
</DataGridTextColumn.HeaderStyle>
通过这种方式,新样式可以添加更多 setter 或覆盖基本样式中的一些 setter
我有一个相当复杂的应用程序,所以我使用 ResourceDictionary 来管理我的所有样式等等。在那里我为 DataGridColumnHeaderBaseStyle 定义了一个样式:
<Style x:Key="DataGridColumnHeaderBaseStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="{StaticResource TableHeaderBackgroundColor}" />
<Setter Property="BorderBrush" Value="{StaticResource GridLinesColor}" />
<Setter Property="BorderThickness" Value="0,0,1,1" />
<Setter Property="Padding" Value="{DynamicResource HeaderPadding}" />
<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}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Path x:Name="SortArrow" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" Width="8" Height="6"
Margin="3,0,0,0" Stretch="Fill" Opacity="0.5" Fill="White" RenderTransformOrigin="0.5,0.4" Visibility="Collapsed"
Data="M0,0 L1,0 0.5,1 z" />
</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>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{StaticResource DisabledTableHeaderBackgroundColor}" />
<Setter Property="BorderBrush" Value="{StaticResource DisabledGridLinesColor}" />
</Trigger>
</Style.Triggers>
</Style>
到目前为止一切顺利。在我的主应用程序中,我有一个加载该样式的 DataGrid。问题是当我为工具提示添加 Setter 时,我丢失了该列的样式模板。
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding Number}" IsReadOnly="True" />
<DataGridComboBoxColumn Header="Region" ItemsSource="{Binding Kiln.Regions, Source={StaticResource MainViewModel}}"
SelectedValueBinding="{Binding RegionNumber}" SelectedValuePath="Number" DisplayMemberPath="Name"
EditingElementStyle="{StaticResource EditingComboBoxStyle}" />
<DataGridCheckBoxColumn Header="Has Mixture" Binding="{Binding HasMixture}" />
<DataGridCheckBoxColumn Header="Has Burners" Binding="{Binding HasBurners}" />
<DataGridTextColumn Header="Burners/Circuits" Binding="{Binding CircuitBurnersNumber}" />
<DataGridTextColumn Header="GP ⌀" Binding="{Binding GasPipeDiameter}" >
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="ToolTip" Value="Gas Pipe ⌀ (mm)" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Gas Orifice ⌀ (mm)" Binding="{Binding GasOrificeDiameter}" />
<DataGridTextColumn Header="Air Pipe ⌀ (mm)" Binding="{Binding AirPipeDiameter}" />
<DataGridTextColumn Header="Air Orifice ⌀ (mm)" Binding="{Binding AirOrificeDiameter}" />
</DataGrid.Columns>
添加忽略样式的其余部分。我错过了什么?有解决此问题的提示吗?
在这里你可以看到我所说的行为。提前致谢。
新样式应从基本样式派生,使用 BasedOn
属性:
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader"
BasedOn="{StaticResource DataGridColumnHeaderBaseStyle}">
<Setter Property="ToolTip" Value="Gas Pipe ⌀ (mm)" />
</Style>
</DataGridTextColumn.HeaderStyle>
通过这种方式,新样式可以添加更多 setter 或覆盖基本样式中的一些 setter