2017-02-01 16 views
1

Я уже проверил Simulating a mousehover effect on a fontIcon in uwp. Но я столкнулся с другой, «мерцающей» проблемой.UWP - PointerEntered/PointerExited для имитации перемещения мыши на сетчатых рядах

У меня есть сетка внутри ScrollViewer, которая является дочерним элементом элемента управления 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). Чтобы достичь этого, я определяю для каждой строки дополнительный прозрачный прямоугольник, ColumnSpan которого равен 3, и добавьте его в качестве последнего дочернего элемента каждой строки. то я даю ему выпадающей следующим образом:

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 появляется и исчезает , И так происходит всякий раз, когда указатель перемещается, даже по той же строке (я не хочу, чтобы вылет исчезли при перемещении указателя по той же строке). Результат - мерцающий всплывающий экран. Мне кажется, что события PointerEntered/PointerExited оба запускаются в любой точке, зависающей.

То, что я уже пробовал:

  1. Ручка PointerEntered только (я знаю, что это не лучшая практика, но я пробовал)
  2. Set PointerEntered.Handled ложь (я думал, что, может быть, другие элементы управления в сетке были воздействуя на поведении)
  3. обращаться с PointerMoved только
  4. хранятся «завис» и «зависание» Прямоугольник (ы) распознавать, когда указатель находится над тем же/другим рядом
  5. Множество других попыток, о которых я даже не помню, всегда получал одинаковые мерцающие результаты.

Может ли кто-нибудь указать мне правильное направление? Заранее спасибо!

ответ

0

Мне кажется, что события PointerEntered/PointerExited оба запускаются в любой точке, зависающей.

Похоже, после того, как Flyout появляется PointerExited будет срабатывает даже мышь не покинуть зону попадания тест. Без Flyout события Pointer могут работать так, как вы думали, для этого вы можете проверить official sample.

Ручка PointerEntered только (я знаю, что это не лучшая практика, но я попробовал)

Таким образом, должны быть в состоянии, так как работал без PointerExited случае Flyout не будут скрыты. Я также проверил его, Flyout не исчезнет, ​​пока не нажмете на другое место. Но, как вы сказали, это не может быть хорошей практикой.

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(); 
} 

еще один способ, вы можете попробовать использовать ToolTip. Вам даже не нужны Pointer события, когда вы навешаете строку, она будет отображаться, и когда вы выйдете, она исчезнет. Он не будет мерцать. Хотя через какое-то время он исчезнет, ​​но я думаю, вам достаточно подробных сведений.

Rectangle rect = new Rectangle(); 
rect.Opacity = 0.3; 
rect.SetValue(Grid.RowProperty, r); 
rect.SetValue(Grid.ColumnSpanProperty, 3); 
rect.Fill = new SolidColorBrush(Colors.Azure); 
Grid flGrid = new Grid(); 
TextBlock flTb1 = new TextBlock(); 
flTb1.Text = "testname"+r; 
flGrid.Children.Add(flTb1); 
rect.SetValue(ToolTipService.ToolTipProperty, flGrid); 
rect.Margin = new Thickness(2); 
MyGrid.Children.Add(rect);