【问题标题】:How to stop parent control taking touch event when it contains a nested button当父控件包含嵌套按钮时如何停止父控件获取触摸事件
【发布时间】:2015-02-27 15:23:29
【问题描述】:

所以我有我的控件,我想在触摸时扩展它并显示我的按钮,该按钮嵌套在控件的数据模板中。然后我希望按钮是可按下的,但如果触摸按钮以外的任何地方,我也希望控件折叠

初始化控制

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 事件?

【问题讨论】:

  • 您是否尝试过处理PreviewTouchDownPreviewTouchUp 而不是TouchDownTouchUp
  • @StevenRands 刚刚尝试过,但行为仍然相同。根据我的理解,使用 Preview 只是意味着更快地触发触摸事件?
  • 这并不是 隧道冒泡 事件之间的真正区别。无论如何,我怀疑您的问题与触摸捕获有关。鉴于您为自定义控件描述的行为,Expander 控件是否更合适?
  • @StevenRands 为控件是来自第三方库的地图上的 PushPin 问题提供更多信息,我已扩展该控件以响应动态设置数据模板的触摸事件,使其外观展开/折叠控件。但这意味着数据模板中的任何控件都不会响应触摸事件
  • 也许尝试仅在 TouchDown 事件上展开/折叠?完全删除触摸捕获的东西和TouchUp 事件处理程序,看看你是否还有同样的问题?

标签: c# wpf events event-handling touch


【解决方案1】:

所以我在按钮上使用了命令,但我将其更改为使用 TouchDown 事件,并且有

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多