长话短说:我有一个窗口,在列表框中显示一堆图表。当鼠标悬停在图表上(使用 LineSeries)时,数据点后面有一条线(捕捉到数据点位置)。在那条线附近,我将展示一个由弹出窗口制成的工具提示,其中显示有关这些数据点的信息。
到目前为止一切顺利。问题是当我尝试将鼠标移到工具提示上时,弹出窗口开始闪烁(就像它在开/闭环中一样)。我已经在弹出窗口和子项上设置了 IsHitTestVisible="False"
。
作为临时解决方案,弹出窗口“消失”出光标,如下所示:
...但很难“理解”。
现在问题来了:出了什么问题?为什么当鼠标悬停在弹出窗口上时,弹出窗口开始闪烁。
欢迎任何反馈
PS。工具提示 XAML(它是在代码中创建的,但在这里):图表的数据上下文是绑定(bind)到类的数据,还有一些图表的事件是通过命令实现的。弹出窗口是在该类的构造函数中创建的,
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)
重新编辑:这就是它的样子
最佳答案
我在使用 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 控件的名称。虽然问题仍然存在,但通过这种方法,闪烁效应已减少到相当大的比例。
关于WPF "tooltip"弹出窗口闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10053879/