WPF弹出跟随鼠标

3 c# wpf popup

那是我的弹出窗口:

<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>
Run Code Online (Sandbox Code Playgroud)

我有主网格,所有东西都在那个网格中。

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

this.Tedavi_Popup.ClearValue(Popup.IsOpenProperty);
this.Tedavi_Popup.IsOpen = true;
Run Code Online (Sandbox Code Playgroud)

我想让弹出窗口始终在网格中打开并让弹出窗口跟随鼠标。

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

当鼠标移动时如何让它出现?

Joh*_*ght 7

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

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

以下是您可以这样做的方法:

  • 为窗口/控件的主容器命名。在下面的示例中,我使用的是Window,我将其命名为myWindow。您可以选择使用您的Grid,只要它填充您想要捕获鼠标移动的表面区域。

    • 这允许您在下一步中定位它。
  • 更改弹出窗口的设置PlacementPlacementMode.Relative设置PlacementTarget是主要的容器,并设置HorizontalOffsetVerticalOffset0

    • 这会将弹出窗口的位置设置为主容器的左上角,然后我们将在事件处理程序中更改它。
  • 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>
Run Code Online (Sandbox Code Playgroud)

你的代码是这样的:

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;

}
Run Code Online (Sandbox Code Playgroud)