【发布时间】:2017-02-01 12:35:51
【问题描述】:
我已经检查了Simulating a mousehover effect on a fontIcon in uwp。但我面临一个不同的“闪烁”问题。
我在 ScrollViewer 中有一个 Grid,它是 PivotItem 控件的子控件。网格一开始是空的,然后以编程方式填充。
<PivotItem>
<ScrollViewer x:Name="MyScrollBar" >
<Grid Name="MyGrid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
</Grid>
</ScrollViewer>
</PivotItem>
然后每列填充 3 个文本块。 我的目标是在悬停在一行(而不是单个 TextBlock)上时显示带有附加详细信息的 Flyout。为此,我为每一行定义了一个额外的透明 Rectangle,其 ColumnSpan 为 3,并将其添加为每行的最后一个子元素。然后我给它一个 Flyout,如下所示:
Rectangle rect = new Rectangle();
rect.Opacity = 0;
rect.SetValue(Grid.RowProperty, r);
rect.SetValue(Grid.ColumnSpanProperty, 3);
Flyout fl = new Flyout();
Grid flGrid = new Grid();
TextBlock flTb1 = new TextBlock();
flTb1.Text = details.Name;
flGrid.Children.Add(flTb1);
fl.Content = flGrid;
rect.SetValue(FlyoutBase.AttachedFlyoutProperty, fl);
rect.PointerEntered += Rect_PointerEntered;
rect.PointerExited += Rect_PointerExited;
rect.Margin = new Thickness(2);
这里是 PointerEntered 和 PointerExited 事件处理程序:
private void Rect_PointerEntered(object sender, PointerRoutedEventArgs e)
{
((Flyout)(((Rectangle)sender).GetValue(FlyoutBase.AttachedFlyoutProperty))).ShowAt((Rectangle)sender);
}
private void Rect_PointerExited(object sender, PointerRoutedEventArgs e)
{
((Flyout)(((Rectangle)sender).GetValue(FlyoutBase.AttachedFlyoutProperty))).Hide();
}
当指针进入网格行的点击区域时,突然出现 Flyout 并消失。每当指针移动时,即使在同一行上也是如此(我不希望在将指针移动到同一行上时 Flyout 消失)。结果是闪烁的弹出窗口。在我看来,PointerEntered/PointerExited 事件都会在任何悬停时触发。
我已经尝试过的:
- 仅处理 PointerEntered(我知道这不是最佳做法,但我尝试过)
- 将 PointerEntered.Handled 设置为 false(我认为网格中的其他控件可能会影响行为)
- 仅处理 PointerMoved
- 存储“悬停”和“悬停”矩形以识别指针何时位于同一行/另一行上方
- 我什至不记得有很多其他尝试...总是得到相同的闪烁结果。
谁能指出我正确的方向?提前谢谢!
【问题讨论】:
标签: c# xaml uwp flicker flyout