WPF ListBoxItem 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 ответа

Вы могли бы использовать DataTrigger прямо на кнопку (или попробуйте применить тот же RelativeSource обязательна в том месте, где она есть)

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

Каждый из ваших предметов будет содержаться в ListBoxItemэто то, что дает ~4 пикселя между каждым элементом. Это также обеспечивает выделение и выбор стиля. Вы можете стилизовать listBoxItem через свойство ListBox.ItemContainerStyle. Переместите свой триггер в контейнер с предметами, и он должен работать как нужно.

Другие вопросы по тегам