WPF ListBoxItem IsMouseOver - PullRequest
       56

WPF ListBoxItem IsMouseOver

3 голосов
/ 16 августа 2011

У меня есть 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 голос
/ 16 августа 2011

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

<Style TargetType="{x:Type Button}">
    <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                 Value="True">
          <!-- ... -->
    </DataTrigger>
</Style>
1 голос
/ 16 августа 2011

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

...