WPF“工具提示”弹出窗口闪烁

时间:2012-04-07 10:59:11

标签: wpf popup flicker

长话短说:我有一个窗口,在ListBox中显示一堆图表。当mouseOver图表(使用LineSeries)时,有一行跟在dataPoints之后(捕捉到dataPoint位置)。在那条线附近,我正在展示一个弹出窗口的工具提示,该弹出窗口显示有关这些dataPoints的信息。

"tooltip" as it appears

到目前为止一切顺利。问题是当我尝试将鼠标移到工具提示上时,弹出窗口开始闪烁(就像在打开/关闭循环中一样)。我已经设置了弹出窗口和孩子IsHitTestVisible="False"

作为临时解决方案,弹出窗口“走出”游标的方式如下:

"tooltip" repositioned

......但很难“理解”。

现在出现了一个问题:出了什么问题?当鼠标悬停在弹出窗口上时,为什么弹出窗口会闪烁。

欢迎任何反馈

PS。工具提示XAML(它是在代码中创建的,但现在是):

图表的datacontext是绑定到类的数据,也有一些图表的事件是通过icommands实现的。弹出窗口是在该类的构造函数中创建的,

ppchart = New Popup() With {.AllowsTransparency = True, .IsHitTestVisible = False,.StaysOpen = True}

...在MouseMoveCommand中创建了弹出窗口的子项:

Dim ppCont As XElement = <Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                                     xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" IsHitTestVisible="False" VerticalAlignment="Top">
                                     <Grid.RowDefinitions>
                                         <RowDefinition Height="Auto"/>
                                         <RowDefinition Height="Auto"/>
                                     </Grid.RowDefinitions>
                                     <Rectangle Opacity="0.5" Grid.RowSpan="2" IsHitTestVisible="False" StrokeThickness="0" RadiusX="2" RadiusY="2" Fill="#FFBABABA"/>
                                     <TextBlock Text="{Binding Over, StringFormat=HH:mm}" FontSize="9" TextAlignment="Center" FontFamily="Segoe UI" IsHitTestVisible="False" Margin="1"/>
                                     <ListBox x:Name="listBox" ItemsSource="{Binding Points}" Background="{x:Null}" BorderBrush="{x:Null}" FontSize="8" Margin="1,0,1,1" Grid.Row="1" IsHitTestVisible="False" IsTextSearchEnabled="False" HorizontalAlignment="Stretch">
                                         <ListBox.ItemContainerStyle>
                                             <Style TargetType="{x:Type ListBoxItem}">
                                                 <Setter Property="Background" Value="Transparent"/>
                                                 <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                                                 <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                                                 <Setter Property="Padding" Value="0"/>
                                                 <Setter Property="IsHitTestVisible" Value="False"/>
                                             </Style>
                                         </ListBox.ItemContainerStyle>
                                         <ListBox.ItemTemplate>
                                             <DataTemplate>
                                                 <Grid IsHitTestVisible="False">
                                                     <Grid.ColumnDefinitions>
                                                         <ColumnDefinition Width="Auto"/>
                                                         <ColumnDefinition Width="Auto"/>
                                                         <ColumnDefinition Width="Auto"/>
                                                     </Grid.ColumnDefinitions>
                                                     <Rectangle Fill="{Binding Culoare}" Width="3" HorizontalAlignment="Left" Margin="1" IsHitTestVisible="False"/>
                                                     <TextBlock Text="{Binding Operation}" HorizontalAlignment="Stretch" IsHitTestVisible="False" Grid.ColumnSpan="1" Grid.Column="1"/>
                                                     <TextBlock Text="{Binding points.Value}" HorizontalAlignment="Stretch" Grid.Column="2" TextAlignment="Right" IsHitTestVisible="False"/>
                                                 </Grid>
                                             </DataTemplate>
                                         </ListBox.ItemTemplate>
                                     </ListBox>
                                 </Grid>

        ppchart.Effect = New Effects.DropShadowEffect() With {.Opacity = 0.5, .BlurRadius = 5, .Direction = 80, .Color = Colors.Black}
        ppchart.Child = CType(XamlReader.Load(New XmlTextReader(New StringReader(ppCont.ToString))), UIElement)

reedited:这就是它的样子

enter image description here

2 个答案:

答案 0 :(得分:2)

使用 MouseEnter MouseLeave 事件时,我也遇到了类似的问题。 WPF上的 MouseEnter 事件有一种奇怪的行为,不知道它是否是一个错误。当您从顶部进入考虑项目时,闪烁发生。从任何其他方向输入项目将为您提供平滑的弹出窗口。所以为了避免它,我删除了:

AllowsTransparency = True

一部分。

<强>编辑:

虽然仍然无法找到满足我需要的完美行为,但我发现这实际上并不是Scott Hanselman所描述的错误here

然而,我无法将问题与我的问题进行比较并对其进行排序。无论如何,为了获得动画功能,我想出了一个解决方案,通过检查鼠标的当前位置,至少可以减少Popup控件的额外打开或关闭。我定义了一个变量

Point currPoint = new Point();

然后在MouseEnter事件或处理程序中:

   ListViewItem listViewItem = e.Source as ListViewItem;           
        if(currPoint!=e.GetPosition(listViewItem))
            compToStrategyVM.OpenPopup(listViewItem, listViewPopup);

同样在MouseLeave事件或处理程序中:

ListViewItem listViewItem = e.Source as ListViewItem;
        if (currPoint != e.GetPosition(listViewItem))
            compToStrategyVM.ClosePopup(listViewPopup);

此处compToStrategyVM指的是我的ViewMode,listViewPopup指的是Popup控件的名称。尽管这个问题仍然存在,但通过这种方法,闪烁效应已经降低到相当大的一部分。

答案 1 :(得分:0)

阅读评论后,我认为您使用的是不正确的事件;每次弹出窗口显示/隐藏或闪烁时,都会不断触发MouseMove事件。

您想要使用MouseEnterMouseLeave个活动。