2011-08-16 93 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'中。) –