WPF Popup鼠标长时间静止停留时频繁闪烁问题咨询
WPF Popup 频繁闪烁原因解析
相关XAML代码
<Style x:Key="myPopupStyle" TargetType="{x:Type ContentControl}"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <!-- Here the data template --> </DataTemplate> </Setter.Value> </Setter> </Style> <Label x:Name="myLabel" MouseEnter="myLabel_ShowTooltip" MouseLeave="myLabel_CloseTooltip"> <Popup x:Name="tooltipPopupMyLabel" AllowsTransparency="True" StaysOpen="False" UseLayoutRounding="True" PlacementTarget="{Binding ElementName=myLabel}" Placement="Bottom"> <ContentControl Content="this is a tooltip popup!" Style="{StaticResource myPopupStyle}"/> </Popup>
事件处理代码
private void myLabel_ShowTooltip(object sender, System.Windows.Input.MouseEventArgs e) { if (!this.tooltipPopupMyLabel.IsOpen) { this.tooltipPopupMyLabel.IsOpen = true; // If I uncomment below line of code it stops flickering. //this.tooltipPopupMyLabel.StaysOpen = true; } } private void myLabel_CloseTooltip(object sender, System.Windows.Input.MouseEventArgs e) { if (this.tooltipPopupMyLabel.IsOpen) { this.tooltipPopupMyLabel.IsOpen = false; //this.tooltipPopupMyLabel.StaysOpen = false; } }
问题现象
鼠标停留在Label上时,Popup能正常显示,但长时间静止不移动鼠标时,Popup会频繁闪烁(快速关闭又重新打开);取消注释this.tooltipPopupMyLabel.StaysOpen = true;后,闪烁消失。
原因解析
- 当
StaysOpen="False"时,WPF内置了Popup的自动关闭逻辑:系统会监听鼠标输入,一旦判定鼠标离开Popup的激活区域(包含PlacementTarget即Label,以及Popup自身),就会自动关闭Popup。 - 你的Popup设置为
Placement="Bottom",紧贴Label下方显示。此时系统的鼠标命中测试可能出现边界判定波动——比如偶尔误判鼠标“离开了”Label区域,触发MouseLeave事件关闭Popup;紧接着又判定鼠标仍在Label上,触发MouseEnter重新打开Popup,循环往复就造成了闪烁。 - 当设置
StaysOpen="True"后,Popup的自动关闭逻辑被禁用,只有你手动通过MouseLeave事件关闭它,不会出现系统自动触发的关闭-打开循环,因此闪烁现象消失。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

