WPF DatagridTemplateColumn单元格单击事件仅在我单击单元格图标时才触发

eulz3vhy  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(350)

我在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>

为什么不起作用?我能做些什么来使它起作用?

pbpqsu0x

pbpqsu0x1#

要使整个单元格能够接收鼠标交互,您必须向模板添加一个容器,该容器跨越整个单元格,或者正确覆盖ControlTemplate。在这种情况下,正确意味着您必须将Border.Background设置为Transparent,以便使其命中测试可见。
一个合适的容器来承载单元格的内容可以是BorderGrid或任何自然延伸以占据全部可用空间的容器。下面的示例使用Border
请注意,在父元素上设置SnapsToDevicePixels就足够了,因为它将被继承。因此,如果在树的根上设置它(例如Window.SnapsToDevicePixels),那么完整的Window及其所有子元素将继承该值。

溶液1

修改列的单元格模板:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Border Background="Transparent">
        <materialDesign:PackIcon Kind="Edit" 
                                 Width="15" 
                                 HorizontalAlignment="Stretch"/>
      </Border>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

溶液2

修改单元格模板(从单元格Style):

<Style x:Key="TemplateColumnCell"
       TargetType="{x:Type DataGridCell}">

  ...

  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border Background="Transparent">
          <ContentPresenter />
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

相关问题