(Справочная информация: я портирую приложение WinForms на WPF поэтапно. В настоящее время у меня все еще есть основная форма WinForms с ElementHost, в которой есть содержимое WPF.)
Я быкак мое приложение, когда мне сообщают, когда определенные ApplicationCommands , такие как Cut , Copy и Paste , изменяют значение своих .CanExecute.Я подумал, что было бы просто подписаться на глобальное событие, такое как ApplicationCommands.Cut.CanExecuteChanged, но я заметил странное поведение, когда оно не вызывается последовательно.
Например, ясоздал упрощенное тестовое приложение WinForms, которое просто имеет ElementHost.Затем я добавил к нему текстовое поле WPF и прикрепил к нему обработчики CanExecuteChanged:
public Form1()
{
InitializeComponent();
var tb = new System.Windows.Controls.TextBox {Text = "WPF Inside ElementHost"};
ApplicationCommands.Cut.CanExecuteChanged += Cut_CanExecuteChanged;
ApplicationCommands.Cut.CanExecuteChanged +=
(s, e) => Debug.WriteLine("CanExecute Changed=" + ApplicationCommands.Cut.CanExecute(null, s as IInputElement));
elementHost1.Child = tb;
}
private void Cut_CanExecuteChanged(object sender, System.EventArgs e)
{
Debug.WriteLine("CanExecute Method for Cut = " + ApplicationCommands.Cut.CanExecute(null, sender as IInputElement));
}
Странно то, что вызывается обработчик, использующий встроенный лямбда / делегат, когда я выполняю такие действия, как выбор текста в текстовом поле,Однако тот, который подписывается с использованием метода экземпляра, не вызывается.
Кроме того, в моем более сложном приложении я не вижу вызова CanExecute вообще, даже когда я использую встроенный делегат дляобработчик.