Я использую Blend SDK KeyTrigger в проекте WPF и имею проблему, что событие запускается несколько раз каждый раз, когда я нажимаю назначенный ключ, здесь DeleteCommand.Blend KeyTrigger срабатывает несколько раз
<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?
KeyUp не имеет значения. – Gunter
Реальная проблема, похоже, связана с OnLoaded и что элементы элементов управления вкладками получают несколько событий OnLoaded. – Gunter
Ок, я вижу. Итак, 'KeyTrigger' является общедоступным классом, поэтому вы можете его расширять и переопределять' OnEvent', чтобы предотвратить добавление обработчика нескольких событий? – dain