WPF的ItemsControl IsMouseOver属性不如预期工作

3
我在WPF窗口的Window.Resources中有以下代码。它的基本功能是创建一个代表网格的项,左侧有一个标签,右侧有一个按钮。当鼠标悬停在标签或按钮上时,行会按预期更改颜色,但我希望如果鼠标在任何一行上方,它也能更改颜色。
如何实现这一点?
感谢您的帮助。
<Window.Resources>
    <dtos:ProjectDto x:Key="data"/>
    <Style x:Key="alternatingWithTriggers" 
           TargetType="{x:Type ContentPresenter}">
        <Setter Property="Height" Value="25"></Setter>
    </Style>
    <Style x:Key="onmouseover" TargetType="{x:Type DockPanel}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Yellow">
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="ItemTemplate">
        <Border x:Name="ItemBorder" HorizontalAlignment="Stretch" BorderThickness="0" Background="#BBB" ClipToBounds="True" >
            <DockPanel ClipToBounds="True" HorizontalAlignment="Stretch" Style="{StaticResource onmouseover}">
                <Label Content="{Binding Name}" HorizontalAlignment="Left" Height="80"></Label>
                <Button Content="Delete" HorizontalAlignment="Right" Margin="0,0,10,0"/>
            </DockPanel>
        </Border>
...
2个回答

11
给 DockPanel 添加Background="Transparent"属性。这样可以让它捕获鼠标事件。

谢谢您的回复,但不幸的是您的建议没有起作用。您能想到其他的方法吗? - Burt
请尝试使用Background="#00000000"代替。 - Aviad P.
1
我刚遇到了这个问题。在网格中将背景设置为透明是可行的。 - oillio
当我覆盖 ListBoxItem 的控件模板以更改选定时的颜色时,这对我很有效,但这导致在鼠标悬停期间无法选择项目的某些部分(我隐藏了在选定时出现的按钮图标)。将上述解决方案添加到我的边框中效果非常好,谢谢。 - LiamJM

2
我在你发布的代码片段中没有看到任何明显的错误。由于我不在Studio前面,所以无法尝试它,但如果我是你,我会尝试在DockPanel上添加一个MouseEnter处理程序(只需将无操作处理程序放入视图的代码后台,因为您将稍后删除它)。
确保当您进入时该处理程序被触发,并使用调试器/立即窗口确保IsMouseOver属性与您预期的一样。这至少会指导您接下来的调试步骤:
如果IsMouseOver为true并且已触发您的处理程序,则我的猜测是您设置的触发器有些问题。
如果IsMouseOver为false或未触发您的处理程序,则我的猜测是类似于IsHitTestVisible被设置为false或类似的东西。
只是为了好玩,我也会尝试将样式声明内联到dockpanel中,以确保如下:
<DataTemplate x:Key="ItemTemplate"> 
    <Border x:Name="ItemBorder" HorizontalAlignment="Stretch" BorderThickness="0" Background="#BBB" ClipToBounds="True" > 
        <DockPanel ClipToBounds="True" HorizontalAlignment="Stretch">
            <DockPanel.Style>
                <Style TargetType="{x:Type DockPanel}">  
                    <Style.Triggers>  
                        <Trigger Property="IsMouseOver" Value="True">  
                            <Setter Property="Background" Value="Yellow"/>  
                        </Trigger>  
                    </Style.Triggers>  
                </Style> 
            </DockPanel.Style>
            <Label Content="{Binding Name}" HorizontalAlignment="Left" Height="80"></Label> 
            <Button Content="Delete" HorizontalAlignment="Right" Margin="0,0,10,0"/> 
        </DockPanel> 
    </Border> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接