命令执行后,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似乎真的不再有关系了。

命令执行后,WPF UI样式在错误状态下被部分冻结

您可以尝试从这里调用CommandManager.InvalidateRequerySuggested()

指挥官只注意在确定当命令目标已经改变时,例如键盘焦点的改变。在里面CommandManager不能充分确定导致命令无法执行,InvalidateRequerySuggested可以是调用以强制CommandManager引发RequerySuggested事件。

同样来自注释:

需要注意的是,如果使用异步调用,然后CommandManager.InvalidateRequerySuggested()应该从主线程调用,因为任何命令侦听器都将打开UI线程。(使用Dispatcher并调用CheckAccess())