Une solution consiste à la file d'attente d'un autre message dans votre gestionnaire Exécuté:
void copy_Executed(object sender, EventArgs e)
{
Dispatcher.BeginInvoke(new ThreadStart(delegate()
{
//do update of bold button here
}), null);
}
Cela permettra d'assurer votre travail est ajouté à l'arrière de la file d'attente, et sera exécuté après d'autres messages de même priorité ou de priorité plus élevée.
Cependant, je voudrais suggérer une meilleure solution. Si vous y réfléchissez, le bouton en gras est responsable de l'exécution de deux commandes différentes: mettre en gras et normaliser. Il bascule entre ces deux commandes en fonction de la position du texte/curseur sélectionnée. Par conséquent, vous pouvez écrire une coutume ICommand
mise en œuvre qui encapsule deux sous-commandes (code complètement non testé):
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);
}
}
Vous pouvez alors construire un TogglingCommand
avec deux commandes: un à Bolden et un au texte unbolden. Ensuite, vous pouvez lier le Button
dans votre interface utilisateur à la propriété ActiveCommand
pour le modifier comme vous le souhaitez en fonction de ce qui se passera lorsque vous cliquerez sur la commande. Par exemple, si vous utilisez un ToggleButton
, vous devez lier IsChecked
à ActiveCommand
et le convertir en true
est la commande active qui n'est pas affectée. Bien sûr, les commandes bolden et unbolden ont besoin de leur propre logique qui inspecte le texte sélectionné.
Merci Kent. J'ai découvert que mon vrai problème est que lorsque je mets le gestionnaire Executed d'un de ces EditingCommands, il n'appellera pas celui par défaut. Je n'ai pas remarqué cela parce que j'avais les CommandBindings dans la Grille et pas RichTextBox donc ils ne fonctionnaient pas. Je vais juste les implémenter. – Jasson