一种解决方法是在您的 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
使用两个命令构造 a:一个用于加粗文本,另一个用于取消粗体文本。然后,您可以将Button
UI 中的 绑定到ActiveCommand
属性,以根据单击命令时发生的情况以您喜欢的方式更改它。例如,如果您正在使用 aToggleButton
您将绑定IsChecked
到ActiveCommand
并转换为true
活动命令是非粗体。当然,粗体和非粗体命令需要CanExecute
它们自己的逻辑来检查所选文本。