我正在使用以下代码
在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
,其中包含一个弹出控件的链接,当鼠标悬停在弹出窗口的链接上时,该窗口会直观显示。
正常行为是弹出窗口一直保持可见,直到鼠标单击。只要鼠标单击不在弹出窗口
当我在弹出窗口的链接上单击鼠标时,我无法解释的奇怪行为发生了。然后,弹出窗口关闭(如预期的那样),但当鼠标悬停在链接上时,它永远不再出现(因为它应)。
你能解释一下这种行为吗?
答案 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>