WPF ListBoxItem IsMouseOver

3

我有一个ListBox,在鼠标悬停在一个项目上时会显示一个删除按钮。问题是,IsMouseOver触发器大约在高亮项目的4个像素处,因此当鼠标悬停在多个项目上时,删除按钮似乎不是随着您上下移动,而是在项目之间的间隙中闪烁。是否有任何方法使IsMouseOver响应整个项目?

<ListBox Name="lstLength" ItemsSource="{Binding Source={StaticResource lengths}}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <DockPanel LastChildFill="True" Height="22">
                <Button DockPanel.Dock="Right" Name="btnDelete" Content="X" Tag="{Binding}" Click="DeleteLength" Visibility="Collapsed" />
                <TextBlock Text="{Binding}" />
            </DockPanel>

            <DataTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="btnDelete" Property="Visibility" Value="Visible" />
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
2个回答

1
你可以直接在按钮上使用 DataTrigger(或者尝试在相同的位置应用 RelativeSource 绑定):
<Style TargetType="{x:Type Button}">
    <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                 Value="True">
          <!-- ... -->
    </DataTrigger>
</Style>

我原本希望整个项目都能对鼠标悬停做出反应,而不仅仅是按钮。 - Mim Hufford
@Mim Huford:在你自己的代码中,你只是改变了按钮上的一些东西,这样做的效果是相同的。DataTrigger放置的位置与它响应的内容无关。(正如我所说,你也可以将其留在Template.Triggers中。) - H.B.

1

你的每个项目都将包含在一个ListBoxItem中,这就是每个项目之间有大约4像素的原因。它还提供了高亮和选择样式。你可以通过ListBox.ItemContainerStyle属性来设置listBoxItem的样式。将你的触发器移动到项目容器上,它应该按预期工作。


1
似乎无法在样式设置器上设置TargetName。 - Mim Hufford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接