单击时如何使命令不禁用按钮
Posted
技术标签:
【中文标题】单击时如何使命令不禁用按钮【英文标题】:How to make command not disable button when clicked 【发布时间】:2015-09-05 06:20:50 【问题描述】:我目前正在 MVVM 中开发一个应用程序。 我正在使用所有按钮 RelayCommand 来执行操作。事实是,使用 RelayCommand,按钮在单击时被禁用,即命令执行的时间。 因为我们的渲染引擎有点重,当我们打开一个新窗口时,按钮会保持禁用状态,比如一秒钟。
我的问题是:有没有办法禁用此行为并启用按钮,因为它会改变样式? 更改禁用样式不是一种选择...
我没有在网上或文档中看到这种行为?
谢谢
编辑:
我的 RelayCommand 的两种不同实现
AnswerCommand = new RelayCommand(p => AnswerMail(p), p => IsMailSelected());
DeleteMailCommand = new RelayCommand(p => Task.Run(() => DeleteMail()), p => IsMailSelected());
【问题讨论】:
你的命令CanExecute
条件是什么?
在某些情况下我没有。该按钮仅禁用函数执行运行的时间
请在此处发布您的RelayCommand
实现。即RelayCommand
源代码。
【参考方案1】:
我认为您应该同步对 ICommand 实例 Execute 方法中存在的块的访问,并且每次到达那里时,启动一个新线程。如果您想多次单击该按钮,则将锁定部分放在那里,会将您的呼叫排在队列中。如果你想在它还在工作的时候拒绝收到的请求,你可以实现 balking 模式。
https://en.wikipedia.org/wiki/Balking_pattern
这样,当创建的线程启动时,您的按钮将不再被禁用。
我不确定这种方法是否对您有帮助,但我认为这是一个可行的方案。
还有一件事,我刚刚发现了这个:
Patterns for Asynchronous MVVM Applications: Commands
我以前没用过,但看起来不错,今晚我会试一试。祝你好运!
【讨论】:
我想要做的主要目标是在单击按钮时不应用禁用样式,如果它实际上阻塞了 UI 线程则发生事件;顺便说一句,我的许多命令都是异步的(例如 new RelayCommand(p => Task.Run(() => MysAyncFunc())),但我有一点时间禁用按钮 @cdie 如果您将耗时的工作发送到另一个线程,您的 Execute 方法将立即返回,并且 Button 将返回其启用状态。 是的,其实我会异步做所有事情以上是关于单击时如何使命令不禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章