操纵事件和平移模式

2024-02-17

我正在开发一个用于触摸设备的 WPF。我面临一个奇怪的问题。我的 XAML 结构是

 <ScrollViewer>
     <StackPanel orientation="Horizontal">
         <!--  Control goes here -->
      </StackPanel>
  <ScrollViewer>

Now

  1. 要启用触摸滚动,我必须设置平移模式 to 仅水平
  2. 要接收操作事件,我必须设置平移模式 to None

问题是我必须同时拥有这两个功能。

是否有任何解决办法,以便触摸时滚动查看器还有操纵完成事件发生。

请帮忙。


我遇到过同样的问题。你至少有两个选择

  • 使用 MS Surface 工具包
  • 修复滚动查看器

我选择了第二个。简单地创建一个自定义控件,继承自ScrollViewer,在Generic.xaml中只需要放一个<ContentPresenter />,仅此而已。 真正的工作是在后面的代码中,但也没有那么复杂。我必须检查用户是否触摸了按钮或只是想滚动。诀窍是检查触摸点上的内容并打开/关闭平移模式。

这是代码:

namespace Demo.Controls
{
   public class ScrollViewerWithTouch : ScrollViewer
   {
    private PanningMode panningMode;


    private bool panningModeSet;

      static ScrollViewerWithTouch()
      {
         DefaultStyleKeyProperty.OverrideMetadata(typeof(ScrollViewerWithTouch), new FrameworkPropertyMetadata(typeof(ScrollViewerWithTouch)));
      }

      protected override void OnManipulationCompleted(ManipulationCompletedEventArgs e)
      {
         base.OnManipulationCompleted(e);

         // set it back
         this.PanningMode = this.panningMode;
      }

      protected override void OnManipulationStarted(ManipulationStartedEventArgs e)
      {
         // figure out what has the user touched
         var result = VisualTreeHelper.HitTest(this, e.ManipulationOrigin);
         if (result != null && result.VisualHit != null)
         {
            var hasButtonParent = this.HasButtonParent(result.VisualHit);

            // if user touched a button then turn off panning mode, let style bubble down, in other case let it scroll
            this.PanningMode = hasButtonParent ? PanningMode.None : this.panningMode;
         }
         base.OnManipulationStarted(e);
      }

      protected override void OnTouchDown(TouchEventArgs e)
      {
         // store panning mode or set it back to it's original state. OnManipulationCompleted does not do it every time, so we need to set it once more.
         if (this.panningModeSet == false)
         {
            this.panningMode = this.PanningMode;
            this.panningModeSet = true;
         }
         else
         {
            this.PanningMode = this.panningMode;
         }

         base.OnTouchDown(e);         
      }

      private bool HasButtonParent(DependencyObject obj)
      {
         var parent = VisualTreeHelper.GetParent(obj);

         if ((parent != null) && (parent is ButtonBase) == false)
         {
            return HasButtonParent(parent);
         }

         return parent != null;
      }
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操纵事件和平移模式 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • Linux 命令“ll”不起作用[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我可以使用我的用户运行 ll 命令 但不能使用 sudo 它给我错误 因为找不到命令 创建别名ll alias ll ls al
  • Qt 读取访问冲突位于:0x0,flags=0x0(第一次机会)

    我有一段非常简单的代码如下 Letter Vakje geefLetter const return m letter Vakje 类使用 NULL 指针进行初始化m letter 但我仍然收到读取访问冲突错误 有人可以帮忙吗 这是调用该函
  • 如何关闭发生错误后保持打开状态的文件?

    我在用 fid fopen fgfg txt 打开一个文件 有时在我设法关闭文件之前会发生错误 在关闭 Matlab 之前我无法对该文件执行任何操作 如果发生错误 如何关闭文件 首先 你可以使用命令 fclose all 其次 你可以使用试
  • 如何使用 addObserver 闭包方法在 Swift 5 中删除Observer

    这是我的第一篇文章 我是日本 iOS 工程师 这个月刚入职 我有一个麻烦removeObserver的方法NotificationCenter在 Swift 5 中 我通过使用闭包类型将观察者添加到 ViewController VC ad
  • GPX 架构验证问题

    我正在构建一个主要使用 GPX 文件作为输入数据的应用程序 鉴于 gpx 文件应该由 gpx 模式定义 如此处定义 http www topografix com gpx asp http www topografix com gpx as
  • PHP:从哈希中解密密码

    因此 我使用以下代码成功将密码加密为密码哈希 class PassHash blowfish private static algo 2a cost parameter private static cost 10 mainly for i
  • 将 Python Pandas 中的列名称从日期时间对象更改为字符串?

    下列的这个食谱 https stackoverflow com questions 28664103 how to transform a time series pandas dataframe using the index attri
  • AngularJS 应用程序身份验证最佳实践

    我开始构建一个 Web 应用程序 用户需要进行身份验证才能访问不同的模块 我过去一直使用 ASP NET MVC 使用 FormsAuthentication 和服务器会话非常容易 因此每次访问时我不必往返数据库即可获取用户角色或任何其他用
  • gradle进程具有不同替换和重命名规则的资源

    我想在我的 gradle 项目中过滤特定的 java 资源 有些文件应该只替换内容 有些文件也应该重命名 并替换不同的内容 我的 gradle java 项目设置是 gt cat build gradle apply plugin java
  • 有没有办法自动关闭 fork() 上的某些句柄?

    背景 我有一个大型的现有进程 它恰好在 AIX 上 所以基本上是 POSIX 语义 它是一个更大系统的一部分 现有流程设计为连续运行 此过程的一个新要求是处理一种新型的复杂输入流 为了降低风险 我决定分叉 执行一个子进程来执行实际的输入处理
  • 从 Terraform 状态文件中获取特定值

    我已经使用 Terraform 部署了我的基础设施 我注意到我在该州有一些有趣的信息 terraform tfstate 我想提取的 terraform 文件 例如 terraform state show packet device wo
  • Winston 3.0 对控制台上的整个输出进行着色

    我正在开发一个 Node js 应用程序 使用babel cli https www npmjs com package babel cli作为 ES6 转译器 我正在使用温斯顿3 0 https www npmjs com package
  • 删除以哈希开头的所有列表元素

    我有一个包含元素的列表 其中一些以 开头 我怎样才能删除这些元素 我试过 content x for x in content 0 if x but content 0 似乎无效 做这个的最好方式是什么 content x for x in
  • 如何在 Rust 可执行文件中嵌入资源?

    这是这个问题在这里 https stackoverflow com questions 10036769 how do you embed resource files in c对 C 提出同样的要求 基本上 有没有比将其转换为巨大的字节数
  • java线程立即更新UI

    我有一个 javaFX 应用程序 可以可视化计算几何算法 算法的执行发生在另一个线程中 我们称之为mainComputingThread 算法可以通过添加 删除 修改形状随时更新 UI 所以代码将如下所示 do some computaio
  • Spark SQL thrift 服务器无法以集群模式运行?

    在 Spark 1 2 0 中 当我尝试以集群模式启动 Spark SQL thrift 服务器时 我得到以下输出 Spark assembly has been built with Hive including Datanucleus
  • 尽管有写权限,scaling_max_freq 仍然无法更改

    我正在尝试更改存储的值in sys devices system cpu cpu0 cpufreq scaling max freq当前设置为 1512000 我正在尝试通过 adb shell 来执行此操作 我输入 su 然后导航到 sy
  • mysql2 gem 安装失败

    我的堆栈如下 CentOS 6 3 安装了 MySQL 5 5 步骤如下http www if not true then false com 2010 install mysql on fedora centos red hat rhel
  • 使用 ASP.NET GenericHandler 时管理 ASP.NET 中的会话超时

    例如 我有一个使用 jQuery 作为客户端框架的 Web 应用程序 现在 大多数页面都通过使用 AJAX 来运行 并通过使用通用处理程序 ashx 与服务器进行通信 现在我有一个问题 我想看看当我的用户会话过期时处理这些请求的最佳解决方案
  • 操纵事件和平移模式

    我正在开发一个用于触摸设备的 WPF 我面临一个奇怪的问题 我的 XAML 结构是