Обходной путь - поставить в очередь другое сообщение в вашем обработчике 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
, которая проверяет выбранный текст.