如何阻止鼠标悬停路由事件冒泡

时间:2014-01-07 02:35:59

标签: c# wpf routed-events

我必须将鼠标悬停在事件冒泡之后才会出现以下情况。

  <Window.Resources>
    <x:Array x:Key="strings" Type="sys:String" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:String>One</sys:String>
        <sys:String>Two</sys:String>
    </x:Array>
    <DataTemplate x:Key="MyDataTemplate">
        <TextBlock Text="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListViewItem}}"/>
    </DataTemplate>

    <DataTemplate x:Key="MyParentDataTemplate">
        <Expander HeaderTemplate="{StaticResource MyDataTemplate}">
            <ListView
              ItemsSource="{StaticResource strings}"
              ItemTemplate="{StaticResource MyDataTemplate}">
            </ListView>
        </Expander>
    </DataTemplate>

    <Style x:Key="ParentListViewItemStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="Foreground" Value="Blue"/>
    </Style>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <ListView ItemContainerStyle="{StaticResource ParentListViewItemStyle}"
              ItemsSource="{StaticResource strings}"
              ItemTemplate="{StaticResource MyParentDataTemplate}">
    </ListView>
</Grid>

问题是我在任何子listviewitem上执行鼠标操作时。相应父级的鼠标也会变为现实。但我只是不希望父母得到鼠标悬停。

我尝试附加行为并尝试设置e.Handled = true,但这不起作用。

1 个答案:

答案 0 :(得分:0)

IsMouseOver与是否为元素触发 MouseOver 事件无关。它与元素是 Mouse.DirectlyOver 还是其祖先之一有关。鼠标下元素的祖先将始终将其IsMouseOver设置为true。我不知道你特意想要完成什么,但如果IsMouseOver不适合你的需求,那么你可能需要根据你的要求创建和管理你自己的依赖属性。