2011-08-16 53 views
3

我有一个列表框,它在鼠标悬停在项目显示该项目的删除按钮。问题是,IsMouseOver触发约4个像素到突出显示的项目,让鼠标移动到多个项目的时候,而不是删除按钮似乎在上下移动你,它在项目之间的差距闪烁。无论如何要让IsMouseOver回应整个项目?WPF ListBoxItem中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> 

回答

1

您的项目中的每一个将被包含在ListBoxItem内,这是什么让各项目之间的〜4个像素。它还提供了亮点和选择样式。您可以通过ListBox.ItemContainerStyle属性设置listBoxItem的样式。将你的触发器移动到物品容器,它应该按需要工作。

+1

的的TargetName不能在风格二传手明显地设置了 –

1

您可以直接在按钮上使用DataTrigger(或尝试采用同样的RelativeSource的地方是绑定):

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

我希望能够使整个项目响应鼠标,而不是仅仅按钮 –

+0

@Mim Huford:在你自己的代码,你只改变了按钮的东西,这样做同样的事情。 DataTrigger的位置与其响应的内容几乎没有什么关系。 (正如我所说的,你也可以把它放在'Template.Triggers'中。) –