我注意到KeyTrigger
在Popup
控件中使用时不会触发。
<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应该失败的原因。
答案 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>