1

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

我使用的图像是美国地图,当用户越过边界时,我需要显示州特定信息。现在我正在使用的实现是Path在地图顶部以透明方式绘制的一系列 s,然后使用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>
4

2 回答 2

1

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

于 2012-06-21T19:51:50.107 回答
0

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

它非常有效并且运行良好,并且您可以在使用您使用路径制作的精确形状时使您的交互区域非常明确。如果我能找到源代码,我会尝试分享,但该项目是一年多前的,所以希望描述能给你足够的想法来激发创造力。:)

于 2012-06-21T19:19:33.183 回答