当 TextBlock 是 UserControl 的一部分时,如何处理 TextBlock.KeyDown 事件?

Den*_*nis 0 c# wpf textblock

我有这个简单的UserControl

<UserControl x:Class="WPFTreeViewEditing.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBlock Text="Hello, world!" KeyDown="TextBlock_KeyDown" />
    </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

我想处理 TextBlock.KeyDown 事件。因此,我在代码隐藏中添加了一个事件处理程序:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void TextBlock_KeyDown(object sender, KeyEventArgs e)
    {
        MessageBox.Show("Key up!");
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不着火。怎么了?

更新。

PreviewKeyDown也不火。

UserControl用于HierarchicalDataTemplate当时:

<Window x:Class="WPFTreeViewEditing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFTreeViewEditing"
        Title="MainWindow" Height="265" Width="419">
    <Grid>
        <TreeView ItemsSource="{Binding}">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local:ViewModel}" ItemsSource="{Binding Items}">
                    <local:UserControl1 />
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

Sha*_*rey 5

来自UIElement.KeyDown的文档:

当焦点位于该元素上时按下某个键时发生。

您使用的 TextBlock 没有焦点,因此您的 KeyDown 事件将由另一个控件处理。

您可以切换到 TextBox 并应用一些样式,使其外观和行为类似于 TextBlock,但您将能够获得焦点并处理事件。