Вызов события после выполнения команды - PullRequest
4 голосов
/ 29 марта 2009

Я ищу способ запустить событие после выполнения команды. Я работаю с EditingCommands (ToggleBold, ToggleItalic ... и т. Д.) И хотел бы иметь возможность вызывать метод непосредственно после того, как команда завершает все, что она делает. Примером может служить выделение некоторого текста и нажатие клавиш Ctrl + B, и выполняется EditingCommands.ToggleBold. Сразу после переключения текста я хочу вызвать метод, который обновит ToggleButton, связанный с выбором FontWeight. Я попытался использовать событие «Выполнено», но, к сожалению, оно вызывается до того, как текст будет затронут, и, следовательно, обновляет кнопку информацией, которая изменится всего за секунду. Кто-нибудь знает способ обойти это? Спасибо за любую помощь!

Приветствия

Ответы [ 2 ]

4 голосов
/ 29 марта 2009

Обходной путь - поставить в очередь другое сообщение в вашем обработчике Executed:

void copy_Executed(object sender, EventArgs e)
{
    Dispatcher.BeginInvoke(new ThreadStart(delegate()
    {
        //do update of bold button here
    }), null);
}

Это обеспечит добавление вашей работы в конец очереди и будет выполняться после других сообщений с таким же или более высоким приоритетом.

Однако я хотел бы предложить лучшее решение. Если вы думаете об этом, кнопка полужирный отвечает за выполнение двух разных команд: сделать жирным шрифтом и сделать нормальным. Он переключается между этими двумя командами на основе текущей выбранной позиции текста / каретки. Следовательно, вы можете написать собственную реализацию ICommand, которая включает две подкоманды (полностью непроверенный код):

public class TogglingCommand : ICommand
{
    private readonly ICommand _command1;
    private readonly ICommand _command2;
    private ICommand _activeCommand;

    public TogglingCommand(ICommand command1, ICommand command2)
    {
        _command1 = command1;
        _command2 = command2;
    }

    public ICommand ActiveCommand
    {
        get { return _activeCommand; }
    }

    public bool CanExecute(object parameter)
    {
        if (_command1.CanExecute(parameter))
        {
            _activeCommand = _command1;
        }
        else if (_command2.CanExecute(parameter))
        {
            _activeCommand = _command2;
        }
        else
        {
            _activeCommand = null;
        }

        return _activeCommand != null;
    }

    public void Execute(object parameter)
    {
        _activeCommand.Execute(parameter);
    }
}

Затем вы можете построить TogglingCommand с помощью двух команд: одна для жирного шрифта и одна для жирного текста. Затем вы можете привязать Button в вашем пользовательском интерфейсе к свойству ActiveCommand, чтобы изменить его так, как вам нравится, в зависимости от того, что произойдет, когда вы нажмете команду. Например, если вы используете ToggleButton, вы должны связать IsChecked с ActiveCommand и преобразовать в true, если активная команда не указана. Конечно, командам bold и unbolden нужна собственная логика CanExecute, которая проверяет выбранный текст.

0 голосов
/ 29 марта 2009

Можете ли вы использовать обработчик прошедшего (прошедшего времени) маршрутизированного события? (Или, может быть, вы пытались это сказать)

public partial class CustomerWindow : Window
{
    public CustomerWindow()
    {
        InitializeComponent();

        CommandBinding binding = new CommandBinding(ApplicationCommands.Copy);
        binding.Executed += new ExecutedRoutedEventHandler(this.copy_Executed);
        this.CommandBindings.Add(binding);
    }

    void copy_Executed(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Executed the Copy command");
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...