首页 / C# / C#检测调用是否在同一UI操作中
C#检测调用是否在同一UI操作中
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#检测调用是否在同一UI操作中,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2645字,纯文字阅读大概需要4分钟。
内容图文
![C#检测调用是否在同一UI操作中](/upload/InfoBanner/zyjiaocheng/674/3bc4440ad52347f3ad408c0572816f1e.jpg)
我的winforms应用程序中有一些不错的,可以正常工作的编辑-撤消功能.它使用CommandStack类工作,该类是两个Stack IStateCommand(一个用于撤消,一个用于重做).每个命令都有一个Execute和Undo方法,而CommandStack对象本身具有一个事件,该事件在更改堆栈时触发.
如果从自己的Undo函数调用LogCommand方法,则CommandStack也可以计算出来,因此可以将其添加到重做堆栈而不是撤消堆栈中.这是通过简单地将当前的ManagingThreadId添加到List< int>中完成的.对象,然后在“撤消”命令完成后将其删除(这与使用堆栈跟踪相反,我认为它会慢得多并且有点脏).
我的应用程序中有很多不同的命令,因此此公式是一成不变的,因为要花几天的时间来重做所有这些IStateCommands实现.
目前唯一的问题是,其中的某些UI事件也会调用其他UI事件,这两个事件都会将IStateCommand记录到撤消历史记录中.在C#中,有什么方法可以检测是否已从同一UI事件(单击,DragDrop,SelectedIndexChanged,TextChanged等)调用了LogCommand函数,然后可以将这些命令组合为一个命令(使用CommandList类,这也继承了IStateCommand)?
我曾想保存调用undo事件时的当前时间,然后如果下一个命令的记录时间少于x毫秒,则将它们合并到历史记录中,但这似乎有些草率.我也考虑过搜索堆栈跟踪,但是我真的不知道寻找根UI事件该寻找什么,也不知道我是否会区分一次单击和一次单击相同的区别.按钮.
知道所有这些命令都是从事件处理程序的UI线程(主要是来自自定义用户控件的事件)中调用的,这可能对您有所帮助.在记录撤消历史记录后,我的应用程序中唯一使用另一个线程的部分将在大多数UI事件之后运行.
谢谢!
排序版本
从相同的UI事件(例如,MouseUp,DragDrop)两次调用相同的方法.第二次调用此方法时,如何检查同一UI事件是否已对其调用过一次?
编辑:解决方案(排序)
这有点脏,因为我没有时间完全重新编写该系统.但是,我以某种方式实现了它,使它可以选择将来不再那么脏.
该解决方案基于Erno对他的回答的评论之一(因此我将他的回答标记为已接受),他建议在其中添加一个参数.我在CommandStack类的LogCommand(IStackCommand)方法中向LogCommand(IStackCommand,string)添加了另一个重载.该字符串是为每个命令存储的actionId,如果该字符串与最后一个字符串相同,则将合并命令.这提供了遍历每个事件并提供唯一ID的选项.
但是,最脏的部分是-为了让它能正常工作,我们必须向客户端展示之前,actionId默认为System.Windows.Forms.Cursor.Position.ToString(),哎呀!由于在执行UI线程时不会更改光标位置,因此将每个命令组合在一起.它实际上甚至结合了TextChanged命令(只要它们不移动鼠标!)
解决方法:
可以将本地的被调用命令堆栈添加到命令中.
当命令执行其他命令时,请将命令添加到本地堆栈,以便在必须撤消或重做命令时可以撤消该本地堆栈上的命令.
编辑
我不太确定您不了解什么.
我只是将CommandList属性添加到StateCommand.每当StateCommand调用/触发另一个StateCommand时,都应将新的StateCommand添加到CommandList中.因此,全局CommandList跟踪可以从UI撤消的命令,每个StateCommand跟踪其调用的StateCommands(因此不会将它们添加到全局undo CommandList中)
编辑2
如果您不能或不想更改该设置,则必须将参数传递给将它们链接在一起的命令的执行.
内容总结
以上是互联网集市为您收集整理的C#检测调用是否在同一UI操作中全部内容,希望文章能够帮你解决C#检测调用是否在同一UI操作中所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。