Я использую Blend SDK KeyTrigger в проекте WPF, и у меня проблема с тем, что событие запускается несколько раз каждый раз, когда я нажимаю назначенную клавишу.
<ei:KeyTrigger FiredOn="KeyDown" ActiveOnFocus="True" SourceName="repositoryPackages" Key="Delete">
<i:InvokeCommandAction Command="{Binding SelectedItem.DeleteCommand, repositoryPackages}" />
</ei:KeyTrigger>
Этот триггер находится в коллекции триггеров ListView, который сам находится в сетке внутри пользовательского элемента управления.
Пользовательский элемент управления затем внедряется на вкладку WPF TabControl в главном окне приложения.
Каждый раз, когда я переключаюсь назад и возвращаюсь на вкладку с моим ListView, триггер вызывает команду еще раз до бесконечности.
Я посмотрел на источник KeyTrigger (в Microsoft.Expressions.Interactions) и заметил следующие строки:
protected override void OnEvent(EventArgs eventArgs)
{
if (this.ActiveOnFocus)
{
this.targetElement = base.Source;
}
else
{
this.targetElement = GetRoot(base.Source);
}
if (this.FiredOn == KeyTriggerFiredOn.KeyDown)
{
this.targetElement.KeyDown += new KeyEventHandler(this.OnKeyPress);
}
else
{
this.targetElement.KeyUp += new KeyEventHandler(this.OnKeyPress);
}
}
Метод OnEvent вызывается один раз за каждый раз, когда связанный элемент триггера получает событие OnLoaded. Но элементы TabControl получают событие OnLoaded каждый раз, когда вы активируете вкладку. Это означает, что вы каждый раз добавляете один и тот же обработчик событий в KeyDown / KeyUp.
Для меня это действительно выглядит большим упущением в реализации Blend SDK KeyTrigger.
У кого-нибудь есть идея предотвратить это или, возможно, как правильно реализовать KeyTrigger?