WPF ListBoxItem IsMouseOver

时间:2011-08-16 11:05:34

标签: c# wpf xaml triggers ismouseover

我有一个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 个答案:

答案 0 :(得分:1)

您的每件商品都将包含在ListBoxItem中,这就是每件商品之间的~4像素。它还提供了亮点和选择样式。您可以通过ListBox.ItemContainerStyle属性设置listBoxItem的样式。将您的触发器移动到项目容器,它应该按照需要工作。

答案 1 :(得分:1)

您可以直接在按钮上使用DataTrigger(或尝试在相应位置应用相同的RelativeSource绑定):

<Style TargetType="{x:Type Button}">
    <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                 Value="True">
          <!-- ... -->
    </DataTrigger>
</Style>