2013-11-06 1 views
0

Я заметил, что KeyTrigger не срабатывает при использовании внутри элемента управления Popup.KeyTrigger не срабатывает, когда внутри управления всплывающим окном

<UserControl x:Class="SilverlightBindingTest.iTest" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="400" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:ii="clr-namespace:Microsoft.Expression.Interactivity.Input;assembly=Microsoft.Expression.Interactions" 
     xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <Popup IsOpen="True"> 
      <i:Interaction.Triggers> 
       <ii:KeyTrigger Key="Enter"> 
        <ei:ChangePropertyAction TargetName="alert" PropertyName="Visibility" Value="Visible" /> 
       </ii:KeyTrigger> 
      </i:Interaction.Triggers> 

      <StackPanel> 
       <TextBox /> 
       <TextBlock Text="hi" x:Name="alert" Visibility="Collapsed"/> 
      </StackPanel> 
     </Popup> 
    </Grid> 
</UserControl> 

При удалении Контекстной части, это работает, как ожидалось («привет» появляется при нажатии Enter).

Что здесь происходит? Я не могу думать о причине, по которой KeyTrigger должен терпеть неудачу.

ответ

0

Что здесь происходит?

KeyTrigger Может быть код добавляет слушателя на корневом каталоге приложения, в этом случае он никогда не будет пузыриться из-под контроля Popup (так как это не в визуальном дереве). Ну, не проблема, я просто проверю источник, и ... о, подождите, источник секретный и проприетарный. Спасибо, Microsoft!

В любом случае, вот ключ-триггер, который прикрепляет слушателя к объекту TriggerBase.AssociatedObject, так что он будет работать внутри всплывающего окна.

public class KeyTriggerThatWorks : TriggerBase<FrameworkElement> 
{ 
    private FrameworkElement _target; 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.Loaded += (sender, args) => 
     { 
      _target = AssociatedObject; 
      _target.KeyDown += new KeyEventHandler(Visual_KeyDown); 
     }; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     _target.KeyDown -= new KeyEventHandler(Visual_KeyDown); 
    } 

    public Key Key { get; set; } 

    void Visual_KeyDown(object sender, KeyEventArgs args) 
    { 
     if (Key == args.Key) 
      InvokeActions(Key); 
    } 
} 

Кроме того, вы все еще прикрепляете это к дочерью всплывающего окна, а не к самому всплывающему окну. Обработчик KeyDown не срабатывает при подключении к Popup по причинам, известным только тем, кто посвящен секретному секретному, секретному коду Microsoft.

<Popup IsOpen="True"> 
    <StackPanel> 

     <i:Interaction.Triggers> 
      <local:KeyTriggerThatWorks Key="Enter"> 
       <ei:ChangePropertyAction TargetName="alert" PropertyName="Visibility" Value="Visible" /> 
      </local:KeyTriggerThatWorks> 
     </i:Interaction.Triggers> 

     <TextBox /> 
     <TextBlock Text="hi" x:Name="alert" Visibility="Collapsed"/> 
    </StackPanel> 
</Popup> 

 Смежные вопросы

  • Нет связанных вопросов^_^