堆栈面板中的wpf鼠标悬停边距

时间:2013-12-22 16:30:49

标签: wpf margin ismouseover

我有一个标签项,标题格式如下:image_margin_textblock。

当鼠标光标在图像上方时,以及在文本块上方,触发器IsMouseOver正常工作。但是,当鼠标光标位于Image和Textblock之间的边距上时,不会触发IsMouseOver触发器。这会产生恼人的闪烁效果。

您是否有任何想法如何实现鼠标悬停触发?

以下是代码:

<TabItem.Header>
<ContentControl>
    <ContentControl.Template>
        <ControlTemplate>
            <StackPanel x:Name="sp0" Orientation="Horizontal">
                <StackPanel x:Name="sp1" Orientation="Horizontal" Background="Blue">
                    <Image VerticalAlignment="Center" HorizontalAlignment="Center" Source="tab1.png"/>
                </StackPanel>
                <TextBlock Margin="10,0,0,0" Text="Tab1" VerticalAlignment="Center"/>
            </StackPanel>
            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" Value="True">
                    <Setter TargetName="sp1" Property="StackPanel.Background" Value="Green"/>
                </DataTrigger>
                <Trigger SourceName="sp0" Property="IsMouseOver" Value="True">
                    <Setter TargetName="sp1" Property="StackPanel.Background" Value="Green"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

谢谢。

2 个答案:

答案 0 :(得分:8)

将外部StackPanel上的Background设置为Transparent,以便该边距也参与HitTest(即响应鼠标事件)。

现在只有image和TextBlock区域响应MouseOver事件。将背景设置为透明将起作用。

<StackPanel x:Name="sp0" Orientation="Horizontal" Background="Transparent">

答案 1 :(得分:5)

将StackPanel的背景设置为Transparent。这使得它可以进行测试。

    <StackPanel x:Name="sp0" Orientation="Horizontal" Background="Transparent">
            <StackPanel x:Name="sp1" Orientation="Horizontal" Background="Blue">
                <Image VerticalAlignment="Center" HorizontalAlignment="Center" Source="tab1.png"/>
            </StackPanel>
            <TextBlock Margin="10,0,0,0" Text="Tab1" VerticalAlignment="Center"/>
    </StackPanel>