WPF弹出窗口跟随鼠标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF弹出窗口跟随鼠标相关的知识,希望对你有一定的参考价值。

那是我的弹出窗口:

<Popup Name="Tedavi_Popup" IsOpen="False" Placement="MousePoint" >
        <Border BorderBrush="Gray" BorderThickness="1" >
            <TextBlock Background="WhiteSmoke" Padding="9,4,9,4" TextWrapping="Wrap" Name="popup"/>
        </Border>
    </Popup>

我有主网格和网格中的所有东西。

那是我的MouseMove事件处理程序:

this.Tedavi_Popup.ClearValue(Popup.IsOpenProperty);
this.Tedavi_Popup.IsOpen = true;

我希望在网格中始终保持弹出窗口打开,并让Popup跟随鼠标。

目前,鼠标移动时不会显示弹出窗口。当鼠标停止时,弹出窗口会出现在鼠标底部。鼠标停止时一切正常。但鼠标移动它不会出现。

如何在鼠标移动时显示它?

答案

由于MouseMove事件在鼠标移动时会快速触发,因此弹出窗口不会在下一次移动发生之前重新绘制在屏幕上。这就是为什么它在鼠标移动时似乎没有显示出来的原因。

为了达到你想要的效果,你需要明确地放置弹出窗口,而不是使用MousePoint放置。

这是你如何做到这一点:

  • 为窗口/控件的主容器命名。在我的下面的例子中,我使用的是Window,我将其命名为myWindow。您可以选择使用Grid,只要它填充您希望捕获鼠标移动的表面区域即可。 这允许您在下一步中定位它。
  • 将弹出窗口的设置Placement更改为PlacementMode.Relative,将PlacementTarget设置为主要容器,并将HorizontalOffsetVerticalOffset设置为0。 这会将弹出窗口的位置设置到主容器的左上角,然后我们将在事件处理程序中进行更改。
  • 在主控件上设置MouseMove事件处理程序,并在该处理程序中,获取鼠标相对于主控件的当前位置,并使用它来设置HorizontalOffsetVerticalOffset值: 这实际上是使弹出窗口与鼠标光标对齐而不必重绘它。

所以你最终得到XAML看起来像这样:

<Window x:Class="WpfApp2.MainWindow" MouseMove="popup_MouseMove" Name="myWindow">
    <Grid>
        <Popup Name="Tedavi_Popup" IsOpen="False" Placement="Relative" HorizontalOffset="0" VerticalOffset="0" PlacementTarget="{Binding ElementName=myWindow}">
            <Border BorderBrush="Gray" BorderThickness="1" >
                <TextBlock Background="WhiteSmoke" Padding="9,4,9,4" TextWrapping="Wrap" Name="popup" />
            </Border>
        </Popup>

    </Grid>
</Window>

你的代码看起来像这样:

private void popup_MouseMove(object sender, MouseEventArgs e)
{
    if (!this.Tedavi_Popup.IsOpen)
        this.Tedavi_Popup.IsOpen = true;

    var mousePosition = e.GetPosition(this.myWindow);
    this.Tedavi_Popup.HorizontalOffset = mousePosition.X;
    this.Tedavi_Popup.VerticalOffset = mousePosition.Y;

}

以上是关于WPF弹出窗口跟随鼠标的主要内容,如果未能解决你的问题,请参考以下文章

在wpf中,处理鼠标Click事件的时候为啥火弹出这样的问题?如图!

wpf 如何让弹出窗口总在屏幕范围之内?

从控制台应用程序启动 WPF 窗口

关于wpf中popup跟随鼠标移动显示

C# wpf 想让控件随着窗口大小变化而变化

为啥 WPF 中的鼠标位置不正确,而缩放桌面上的 Winforms 则不正确?