Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP:PointerPressed未在子元素上激发_C#_Uwp_Event Handling_Mouseevent_Event Bubbling - Fatal编程技术网

C# UWP:PointerPressed未在子元素上激发

C# UWP:PointerPressed未在子元素上激发,c#,uwp,event-handling,mouseevent,event-bubbling,C#,Uwp,Event Handling,Mouseevent,Event Bubbling,我有一个UWP应用程序,其中一个RelativePanel“parent”包含另一个RelativePanel“child”。 它们都应该能够以不同的方式处理PointerPressed事件 当我单击父级时,父级的PointerPressed事件处理程序被正确地激发,但当我单击子级时,再次只激发父级的PointerPressed事件处理程序,这样子级的PointerPressed事件处理程序就永远不会被调用 如何配置子级以便调用其PointerPressed事件处理程序 下面是创建这些元素的代码

我有一个UWP应用程序,其中一个RelativePanel“parent”包含另一个RelativePanel“child”。 它们都应该能够以不同的方式处理PointerPressed事件

当我单击父级时,父级的PointerPressed事件处理程序被正确地激发,但当我单击子级时,再次只激发父级的PointerPressed事件处理程序,这样子级的PointerPressed事件处理程序就永远不会被调用

如何配置子级以便调用其PointerPressed事件处理程序

下面是创建这些元素的代码摘录(所有工作都在代码隐藏中完成,因为这些元素应该在运行时创建):


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

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

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

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

我知道这并不能完全回答您的问题,但可能会在某种程度上帮助您进行调试

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

基本上,子click事件被正确地触发,然后父click事件被立即触发,这在本例中对我来说似乎是正确的

XAML


我知道这并不能完全回答您的问题,但它可能会在某种程度上帮助您进行调试

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

基本上,子click事件被正确地触发,然后父click事件被立即触发,这在本例中对我来说似乎是正确的

XAML


你能分享你的XAML吗?这都是代码隐藏,因为这些元素必须在运行时创建,但我为该代码添加了一个摘要。你能分享你的XAML吗?这都是代码隐藏,因为这些元素必须在运行时创建,但我为该代码添加了一个摘要谢谢Adam,我有一个类似的测试项目,我有同样的行为。为了完全透明,PointerPressed事件在某些情况下不会触发,也不总是这样,但我还不了解触发和不触发的条件。所以我在寻找一个更宽泛的(无偏见的)答案,看看我的设置是否做错了什么……这里有进一步的想法吗?谢谢大家!@因为我无法复制这个问题,恐怕不行。如果您可以创建一个示例项目并将其上载到GitHub,我一定会看一看并让您知道我的发现…好的,我将尝试打包一个最小的项目来重现问题。OK you Adam,我有一个类似的测试项目,我有相同的行为。为了完全透明,PointerPressed事件在某些情况下不会触发,也不总是这样,但我还不了解触发和不触发的条件。所以我在寻找一个更宽泛的(无偏见的)答案,看看我的设置是否做错了什么……这里有进一步的想法吗?谢谢大家!@因为我无法复制这个问题,恐怕不行。如果您可以创建一个示例项目并将其上载到GitHub,我一定会看一看并让您知道我的发现……好的,我将尝试打包一个复制该问题的最小项目
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
    }
}
<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>
    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
    }