如何防止父级控件在包含嵌套按钮时占用触摸事件

3

我有一个控件,希望在触摸时扩展并显示嵌套在数据模板中的按钮。然后,我希望该按钮可按,但如果除了按钮以外的任何地方被触摸,该控件也会折叠起来。

初始化控件

MyControl mc = new MyControl();
mc.TouchDown += mc_TouchDown;
mc.TouchUp += mc_TouchUp;

事件处理程序

    void mc_TouchDown(object sender, TouchEventArgs e)
    {
        var mc = (MyControl)sender;
        mc.CaptureTouch(e.TouchDevice);
    }

    void mc_TouchUp(object sender, TouchEventArgs e)
    {
        var mc = (MyControl)sender;
        if (mc != null && e.TouchDevice.Captured == mc)
        {
            //Expand and show button / Collapse and hide button
            mc.ReleaseTouchCapture(e.TouchDevice);
        }
    }

现在按钮位于MyControl的数据模板中,并与一个命令连接,当我触摸按钮以运行命令MyControl时,会触发MyControl的触摸事件,而按钮的点击被忽略了。
如何使得MyControl上的触摸事件可以正常工作,但是当显示并触摸按钮时,按钮的触摸事件优先于MyControl的事件?

@StevenRands 我刚试过了,但行为还是一样的。从我的理解来看,使用Preview只意味着触摸事件被更快地触发了? - JKennedy
这并不是“隧道”和“冒泡”事件的真正区别。无论如何,我怀疑你的问题与触摸捕获有关。鉴于您描述的自定义控件行为,Expander控件是否更适合? - Steven Rands
@StevenRands 给这个问题提供更多信息,该控件是第三方库地图上的一个 PushPin,我已经扩展它以响应触摸事件,并动态设置数据模板,从而呈现出可扩展/折叠控件的外观。但这意味着数据模板中的任何控件都无法响应触摸事件。 - JKennedy
也许尝试仅在“TouchDown”事件上展开/折叠?完全删除触摸捕获内容和“TouchUp”事件处理程序,看看是否仍然存在相同的问题? - Steven Rands
@StevenRands 我已经尝试删除捕获内容,但仍然存在同样的问题。 - JKennedy
显示剩余3条评论
2个回答

3

我的按钮最初使用了Command,但是我将其更改为使用TouchDown事件,并进行了调整。

    private void addToDiary_TouchDown(object sender, TouchEventArgs e)
    {
        //do my thing
        e.Handled = true;
    }

这意味着按钮已被执行,事件没有冒泡到MyControl


1
尝试为 TouchEventArgs 设置 e.Handled = true 以防止事件冒泡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接