UWP: PointerPressed не запускается для дочернего элемента - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть приложение UWP, в котором родительский элемент RelativePanel содержит другой дочерний элемент RelativePanel.Они оба должны иметь возможность обрабатывать событие PointerPressed по-разному.

Когда я нажимаю на родителя, корректно запускается обработчик события PointerPressed родительского элемента, но когда я нажимаю на дочернем, снова толькообработчик события PointerPressed родительского элемента запускается, так что обработчик события PointerPressed дочернего элемента никогда не вызывается.

Как настроить дочерний элемент так, чтобы вызывался его обработчик события PointerPressed?

Вот выдержка из кода для создания этих элементов (все сделано в коде, поскольку эти элементы должны быть созданы во время выполнения):

public class ChildView
{
    public RelativePanel View { get; set; }

    public ChildView()
    {
        View.Width = 18;
        View.Height = 18;
        View.SetValue(Canvas.ZIndexProperty, 30);  // we want the child always on top of the parent
        View.Background = new SolidColorBrush(Colors.Transparent);

        // Add the gesture recognizers:
        View.Holding += HandleLongPressGesture;
        View.PointerPressed += HandleTapGesture;
        View.PointerReleased += HandlePointerReleased;
        View.DoubleTapped += HandleDoubleTapGesture;
    }

    public void HandleLongPressGesture(object sender, HoldingRoutedEventArgs e)
    {
        // my logic
    }
    private void HandlePointerReleased(object sender, PointerRoutedEventArgs e)
    {
        // my logic
    }
    private void HandleDoubleTapGesture(object sender, DoubleTappedRoutedEventArgs e)
    {
        // my logic
    }
    private void HandleTapGesture(object sender, PointerRoutedEventArgs e)
    {
        // my logic
    }
}

public class ParentView
{
    private ChildView child;

    public RelativePanel View { get; set; }

    public ParentView()
    {
        child = new ChildView();
        View.Children.Add(child.View);
        View.PointerPressed += HandleTapGesture;
        View.PointerReleased += HandlePointerReleased;
    }

    private void HandlePointerReleased(object sender, PointerRoutedEventArgs e)
    {
        // my logic
    }
    private void HandleDoubleTapGesture(object sender, DoubleTappedRoutedEventArgs e)
    {
        // my logic
    }
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я знаю, что это не совсем ответ на ваш вопрос, но, возможно, это поможет вам как-то отладить.

Хорошо, поэтому я настроил простой проект (до того, как вы добавили свой кодна вопрос) и не смог повторить вашу проблему.

По сути, событие нажатия «Дочерний» запускалось правильно, затем сразу же запускалось событие «Родительский щелчок», что мне кажется правильным в данном случае.

XAML

<Grid>
    <RelativePanel Name="Parent" HorizontalAlignment="Left" Height="460" Margin="437,162,0,0" VerticalAlignment="Top" Width="458" Background="#FFFF5C5C" PointerPressed="Parent_PointerPressed">
        <RelativePanel Name="Child" HorizontalAlignment="Left" Height="360" Margin="62,50,0,0" VerticalAlignment="Top" Width="334" Background="#FF3B9C9C" PointerPressed="Child_PointerPressed"/>
    </RelativePanel>
</Grid>

C #

    private void Parent_PointerPressed(object sender, PointerRoutedEventArgs e)
    {
        // Breaks here when Parent is pressed
        // Also breaks here after breaking on Child_PointerPressed
    }

    private void Child_PointerPressed(object sender, PointerRoutedEventArgs e)
    {
        // Breaks here when Child is pressed
    }
0 голосов
/ 26 февраля 2019

установите фон вашей дочерней панели прозрачным.

при возникновении события, убедитесь, что вы делаете .Handled = true;в аргументах входящего обработчика, чтобы предотвратить распространение на родительский элемент управления.

...