鼠标单击控件后,不会在弹出控件上触发MouseEnter事件

时间:2017-06-21 11:00:05

标签: c# wpf

我正在使用以下代码

在WPF中测试Popup控件
<Window x:Class="Popup1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Popup1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="250">

    <Grid>
        <TextBlock  TextWrapping="Wrap">You can use a popup to provide a link for a specific 
            <Run TextDecorations="Underline" MouseEnter="ContentElement_OnMouseEnter">
                term
            </Run>
        </TextBlock>
        <Popup Name="popLink" StaysOpen="False" Placement="Mouse" MaxWidth="200"
           PopupAnimation="Slide" AllowsTransparency="True">
            <Border>
                <TextBlock Margin="10" TextWrapping="Wrap">
                For more information, see 
                <Hyperlink NavigateUri="http://en.wikipedia.org/wiki/Term" Click="Hyperlink_OnClick">Wikipedia</Hyperlink>
                </TextBlock>
            </Border>
        </Popup>
    </Grid>

</Window>

和处理程序

private void ContentElement_OnMouseEnter(object sender, MouseEventArgs e) {
    popLink.IsOpen = true; 
}

private void Hyperlink_OnClick(object sender, RoutedEventArgs e) {
    Process.Start(((Hyperlink) sender).NavigateUri.ToString());
}

结果是一个简单的窗口,其中包含一个textblock,其中包含一个弹出控件的链接,当鼠标悬停在弹出窗口的链接上时,该窗口会直观显示。 正常行为是弹出窗口一直保持可见,直到鼠标单击。只要鼠标单击不在弹出窗口

的链接上,这就可以正常工作

当我在弹出窗口的链接上单击鼠标时,我无法解释的奇怪行为发生了。然后,弹出窗口关闭(如预期的那样),但当鼠标悬停在链接上时,它永远不再出现(因为它应)。

你能解释一下这种行为吗?

2 个答案:

答案 0 :(得分:1)

如评论所述,原因可能是关闭弹出窗口和重新打开之间的竞争条件,因为鼠标位于文本块上方。您可以通过延迟弹出打开操作来阻止这种情况,直到当前工作完成:

private void ContentElement_OnMouseEnter(object sender, MouseEventArgs e)
{
    Dispatcher.BeginInvoke(new Action(() => popLink.IsOpen = true));
}

关于你的标题文本:实际触发了MouseEnter事件(调试它!),因为弹出窗口处于不一致状态,所以内部的操作无法按预期工作。

答案 1 :(得分:0)

经过一些调整后,如果我们为Popup Close事件添加一个额外的事件(比较初始代码)处理程序,并在弹出窗口关闭时将IsOpen属性设置为false,则会实现最佳行为

private void PopLink_OnClosed(object sender, EventArgs e) {
       if (popLink.IsOpen) {
            popLink.IsOpen = false;
       }            
    }

和XAML中的ammenment

<Popup Name="popLink" StaysOpen="False" Placement="Mouse" MaxWidth="200"
       PopupAnimation="Slide" AllowsTransparency="True"
           Closed="PopLink_OnClosed">
        <Border Background="Bisque">
            <TextBlock Margin="10" TextWrapping="Wrap">
            For more information, see 
            <Hyperlink NavigateUri="http://en.wikipedia.org/wiki/Term" Click="Hyperlink_OnClick">Wikipedia</Hyperlink>
            </TextBlock>
        </Border>
    </Popup>