我在WPF中有一个datagrid,其中包含一些TextColumns和一个TemplateColumn。它们有不同的样式。每个TextColumn都有相同的BasicCell样式,如果您单击列的一个单元格,则可以正常工作。TemplateColumn具有TemplateColumnCell样式。它包含一个MaterialDesign图标,看起来像这样:
<DataGridTemplateColumn Header="Edit" Width="0.5*" CellStyle="{StaticResource TemplateColumnCell}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<materialDesign:PackIcon Kind="Edit" Width="15" HorizontalAlignment="Stretch"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
此模板列的单元格样式包含PreviewMouseLeftButtonDown的EventSetter,但它仅在单击图标时触发。我希望它在单击单元格时触发,而不一定是单击图标。
<Style x:Key="TemplateColumnCell"
TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Gainsboro"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="0"/>
</Trigger>
<DataTrigger Binding="{Binding IsEnabled}" Value="False">
<Setter Property="IsEnabled" Value="True"/>
<Setter Property="Foreground" Value="LightSlateGray"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<EventSetter Event="PreviewMouseLeftButtonDown"
Handler="myTemplateCell_PreviewMouseDown"/>
</Style>
为什么不起作用?我能做些什么来使它起作用?
1条答案
按热度按时间pbpqsu0x1#
要使整个单元格能够接收鼠标交互,您必须向模板添加一个容器,该容器跨越整个单元格,或者正确覆盖
ControlTemplate
。在这种情况下,正确意味着您必须将Border.Background
设置为Transparent
,以便使其命中测试可见。一个合适的容器来承载单元格的内容可以是
Border
或Grid
或任何自然延伸以占据全部可用空间的容器。下面的示例使用Border
。请注意,在父元素上设置
SnapsToDevicePixels
就足够了,因为它将被继承。因此,如果在树的根上设置它(例如Window.SnapsToDevicePixels
),那么完整的Window
及其所有子元素将继承该值。溶液1
修改列的单元格模板:
溶液2
修改单元格模板(从单元格
Style
):