Стиль пользовательского интерфейса WPF частично завис в неправильном состоянии после выполнения команды - PullRequest
0 голосов
/ 31 мая 2011

другой день, другая проблема. Честно говоря, было бы довольно скучно, если бы это прекратилось, не так ли?

РЕДАКТИРОВАТЬ: Кажется, что вся фоновая информация устарела. Вот выложенная версия: Мой класс Command устанавливает CanExecuteChanged с событием CommandManagers RequerySuggested (как описано здесь: Реализация пользовательской ICFmand WPF и событие 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; }
    }
}

В моем случае CommandManager не может предложить запрос, где он будет иметь какое-то значение. Теперь я должен обойти это и заставить его запросить. Кто-нибудь знает, как это сделать?

Другое Редактирование: Я уже очень много перепробовал (изменил логику команд, удалил шаблон управления и стиль) и все еще застрял на этом. Однако я не могу воспроизвести проблему в изолированном сценарии с песочницей. Я действительно думаю, что страдаю от ошибки здесь, поскольку поведение Баттона несовместимо с его внешним видом, даже если Стиль сводится к следующему:

<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 восстанавливается - кнопка выглядит так же неактивно, как и она.

Обновление: Поскольку я не смог воспроизвести эту проблему, я закрыл этот вопрос. Единственный ответ, который он получил, был хорошим, но после того, как он столько раз редактировал вопрос, вопросы больше не кажутся связанными.

1 Ответ

1 голос
/ 31 мая 2011

Вы можете попробовать позвонить CommandManager.InvalidateRequerySuggested() с здесь .

CommandManager только обращает внимание определенным условиям при определении когда цель команды изменилась, например, изменение фокуса клавиатуры. В ситуации, когда CommandManager недостаточно определяет изменить в условиях, которые вызывают команда не может быть выполнена, InvalidateRequerySuggested может быть вызывается, чтобы заставить CommandManager вызвать событие RequerySuggested.

также из заметок:

Следует отметить, что если вы используя асинхронные вызовы, то CommandManager.InvalidateRequerySuggested () должен быть вызван из основного потока, слушатели любой команды будут включены поток пользовательского интерфейса. (Используйте диспетчер и вызовите CheckAccess ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...