WPF弹出窗口跟随鼠标移动

3
这是我的弹出框:
<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;

我希望在网格中始终保持弹出窗口的开启,并使弹出窗口随鼠标移动。

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

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

1个回答

9

由于鼠标移动时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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接