在Popup控件内部时,KeyTrigger不会触发

时间:2013-11-06 19:18:17

标签: c# silverlight xaml blend

我注意到KeyTriggerPopup控件中使用时不会触发。

<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>

删除Popup部分时,按预期工作(按Enter键时出现“hi”)。

这里发生了什么?我想不出KeyTrigger应该失败的原因。

1 个答案:

答案 0 :(得分:0)

  

这里发生了什么?

也许KeyTrigger代码会在应用程序根目录中添加侦听器,在这种情况下,它永远不会从Popup控件中冒出来(因为它不在可视化树中)。好吧,没问题,我只是查看源代码,然后......哦等等,源代码是秘密的和专有的。谢谢微软!

无论如何,这是一个将侦听器附加到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);
    }  
}

此外,您仍然将此附加到Popup的子项,而不是Popup本身。 KeyDown处理程序在附加到Popup时不会触发,原因只有那些知道微软秘密专有代码的人才知道。

<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>