WPF ItemsControl IsMouseOver无法按预期工作

时间:2009-12-31 16:18:39

标签: c# wpf silverlight xaml

我在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 个答案:

答案 0 :(得分:8)

提供DockPanel Background="Transparent"。这应该允许它捕获鼠标事件。

答案 1 :(得分:1)

我发布的片段中没有看到任何明显错误,因为我不在Studio前面,我无法尝试,但如果我是你,我会尝试添加一个DockPanel上的MouseEnter处理程序(只是在视图的代码隐藏中抛出do-nothing处理程序,因为稍后你将删除它)。

确保在输入时遇到处理程序,并使用调试器/立即窗口确保IsMouseOver属性符合您的预期。这至少会指导您的下一个调试步骤:

如果IsMouseOver为真并且您的处理程序被命中,那么我的猜测就是您设置的触发器不太正确。

如果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>