【问题标题】:UWP: PointerPressed is not fired on a child elementUWP:PointerPressed 未在子元素上触发
【发布时间】:2025-12-10 01:45:01
【问题描述】:

我有一个 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
    }
}

【问题讨论】:

  • 你能分享你的 XAML 吗?
  • 所有代码都在后面,因为这些元素必须在运行时创建,但我为该代码添加了摘要

标签: c# uwp event-handling mouseevent event-bubbling


【解决方案1】:

将子面板的背景设置为透明。

当事件触发时,请确保执行 .Handled=true; 在传入的处理程序参数上,以防止传播到父控件。

【讨论】:

    【解决方案2】:

    我知道这并不完全是您问题的答案,但也许它会以某种方式帮助您进行调试。

    好的,所以我设置了一个简单的项目(在您将代码添加到问题之前)并且无法复制您的问题。

    基本上,子点击事件被正确触发,然后父点击事件被立即触发,在这种情况下,这对我来说似乎是正确的。

    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
        }
    

    【讨论】:

    • 谢谢亚当,我有一个类似的测试项目,我也有同样的行为。为了完全透明,在某些情况下不会触发 PointerPressed 事件,但并非总是如此,但我还不了解它何时触发以及何时不触发的条件。所以我一直在寻找更广泛(无偏见)的答案,看看我在设置中是否做错了什么......
    • 这里还有什么想法吗?谢谢!
    • @CristianoGhersi 因为我无法复制这个问题,恐怕不会。如果您可以创建一个示例项目并将其上传到 GitHub,我一定会看看并让您知道我的发现...
    • 好的,我将尝试打包一个重现问题的最小项目