A Popup
по умолчанию не фокусируется, и даже если он фокусируемый, вы должны иметь что-то еще, что можно сфокусировать на всплывающем окне, а затем сфокусировать или выделить его, чтобы оно получало событие клавиатуры.
Другими словами, если вы хотите получить событие клавиатуры от Popup
, используйте Focusable="True"
и установите фокусируемый элемент управления, например TextBox
, или Button
, или ListBox
, и пусть пользователь даст емусфокусируйтесь, щелкнув по нему или вручную используя Focus()
из кода.Если вы сделаете все это, то PreviewKeyDown
должно сработать для Popup
.
. Вот небольшая демонстрационная программа с кнопкой переключения, которая открывает Popup
и показывает, что ползунок увеличивается, когда мы получаемPreviewKeyDown
событие Popup
:
<Grid>
<StackPanel>
<Slider Name="slider1"/>
<ToggleButton x:Name="toggleButton1"
Content="Open Popup"/>
</StackPanel>
<Popup PlacementTarget="{Binding ElementName=toggleButton1}"
IsOpen="{Binding IsChecked, ElementName=toggleButton1, Mode=OneWay}"
Focusable="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewKeyDown">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=slider1}"
PropertyName="Value"
Value="1"
Increment="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<TextBox Background="White"
Focusable="True">
<TextBox.Text>Sample Popup content.</TextBox.Text>
</TextBox>
</Popup>
</Grid>