单个图像中鼠标悬停事件的多个区域

时间:2012-06-21 19:10:01

标签: c# wpf image mouseevent mouseenter

我在WPF中有一个图像,我希望根据鼠标当前悬停的位置显示不同的信息。我知道我在网站上看过这个,我似乎无法弄清楚在WPF中执行此操作的代码。

我正在使用的图像是美国地图,当用户越过边框时,我需要显示状态特定信息。现在我正在使用的实现是在地图顶部透明绘制的一系列Path,然后使用Mouse.MouseEnter事件来触发更改。问题是更新似乎遭受了可怕的延迟,否则MouseEnter事件并不总是正常捕获。

有人知道更好的方法吗?

示例C#

    private void wyoming_MouseEnter(object sender, MouseEventArgs e)
    {            
        //stateName.Text = "Wyoming";            
    }

示例XAML

<Canvas MouseDown="Canvas_MouseDown" Name="canvas">
    <Viewbox Stretch="Uniform">
        <Image Source="USA.png" />
    </Viewbox>
    <Path Name="wyoming" Stroke="Transparent" StrokeThickness="1" Mouse.MouseEnter="wyoming_MouseEnter" Mouse.MouseMove="wyoming_MouseMove">
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigureCollection>
                        <PathFigure IsClosed="True" StartPoint="184,121" >  <!--NW-->
                            <PathFigure.Segments>
                                <PathSegmentCollection>
                                    <LineSegment Point="266,129" />
                                    <LineSegment Point="264,193" />
                                    <LineSegment Point="203,190" /> 
                                    <LineSegment Point="177,186" /> 
                                </PathSegmentCollection>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathFigureCollection>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
</Canvas>

2 个答案:

答案 0 :(得分:1)

好吧,在玩了更多这个之后,我发现我的问题是我没有填充路径,只保留它们作为线条。这基本上是针对一个非常小的事件触发区域,因此WPF有时会错过该事件。通过填充透明,一切都很快。

答案 1 :(得分:0)

我个人对同一个实例做了什么(除了我标记了有关时区和广播区域的信息)我为我希望能够在鼠标悬停时激活并将它们放在美国地图上的区域制作了透明路径形状,然后我为MouseEnter / MouseLeave事件附加了一个事件触发器,因此当用户将鼠标悬停在任何路径的区域上时,它将触发该条件并执行指定的操作....在我的实例中它显示了广播电台基于地区和时区的广播时间和节目。因此,如果一个是Moused over,则信息框可见性设置为Visible。在MouseLeave上,相同的信息框设置为Collapsed .... etc

它非常有效并且工作得非常好,当您使用Paths制作的精确形状时,您可以非常明确地定义交互区域。如果我可以挖掘源代码,我会尝试分享,但该项目已经超过一年了,所以希望这些描述能给你足够的想法来获得创造力。 :)