命令执行后,WPF UI样式在错误状态下被部分冻结
本文关键字:状态 冻结 错误 执行 WPF 样式 UI 命令 | 更新日期: 2023-09-27 17:57:58
又是一天,又是一个问题。老实说,如果这一切停止了,那会很无聊,不是吗?
编辑:似乎所有的背景信息都过时了。以下是简化版本:我的Command类使用CommandManagers RequerySuggested事件装配CanExecuteChanged(如这里所述:WPF自定义ICommand实现和CanExecuteChanged事件)。
public abstract class CommandBase : ICommand
{
public abstract void Execute(object parameter);
public abstract bool CanExecute(object parameter);
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
在我的情况下,指挥官没有提出一个重要的要求。现在我不得不绕过这个,强迫它重新查询。有人知道怎么做吗?
另一次编辑:我现在已经尝试了很多事情(更改命令逻辑,删除控制模板和样式),但仍然会遇到困难。不过,我无法在一个孤立的沙箱场景中重现这个问题。我真的认为我受到了一个错误的困扰,因为按钮的行为与其外观不一致,即使风格可以归结为以下几点:
<Style TargetType="{x:Type Button}" x:Key="CertificateActionButton">
<Setter Property="Background" Value="{DynamicResource CertificateActionButtonBackground}"/>
<Setter Property="BorderThickness" Value="0"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style>
当我取消聚焦,然后再次聚焦窗口时,Coherence被恢复-按钮看起来和它一样不活动。
更新:由于我无法重现此问题,我关闭了此问题。它得到的唯一答案是一个很好的答案,但在编辑了这么多次这个问题之后,q&a似乎真的不再有关系了。
您可以尝试从这里调用CommandManager.InvalidateRequerySuggested()
。
指挥官只注意在确定当命令目标已经改变时,例如键盘焦点的改变。在里面CommandManager不能充分确定导致命令无法执行,InvalidateRequerySuggested可以是调用以强制CommandManager引发RequerySuggested事件。
同样来自注释:
需要注意的是,如果使用异步调用,然后CommandManager.InvalidateRequerySuggested()应该从主线程调用,因为任何命令侦听器都将打开UI线程。(使用Dispatcher并调用CheckAccess())