<Window x:Class="RoutedEvents.TunneledKeyPress" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TunneledKeyPress" Height="400" Width="400" PreviewKeyDown="SomeKeyPressed" > <StackPanel> <Label Margin="5" BorderBrush="Black" BorderThickness="1" HorizontalContentAlignment="Stretch" PreviewKeyDown="SomeKeyPressed"> <StackPanel PreviewKeyDown="SomeKeyPressed"> <TextBlock Margin="3" HorizontalAlignment="Center" PreviewKeyDown="SomeKeyPressed"> Image and text label </TextBlock> <Image Source="c:image.jpg" Stretch="None" PreviewKeyDown="SomeKeyPressed"/> <DockPanel Margin="10" PreviewKeyDown="SomeKeyPressed"> <TextBlock Margin="3" PreviewKeyDown="SomeKeyPressed">Type here:</TextBlock> <TextBox PreviewKeyDown="SomeKeyPressed" KeyDown="SomeKeyPressed"></TextBox> </DockPanel> </StackPanel> </Label> <ListBox Margin="5" Name="lstMessages"></ListBox> <CheckBox Margin="5" Name="chkHandle">Handle first event</CheckBox> <Button Click="cmdClear_Click" HorizontalAlignment="Right" Margin="5" Padding="3">Clear List</Button> </StackPanel> </Window> //File:Window.xaml.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace RoutedEvents { public partial class TunneledKeyPress : System.Windows.Window { public TunneledKeyPress() { InitializeComponent(); } protected int eventCounter = 0; private void SomeKeyPressed(object sender, RoutedEventArgs e) { eventCounter++; string message = "#" + eventCounter.ToString() + ": " + " Sender: " + sender.ToString() + " " + " Source: " + e.Source + " " + " Original Source: " + e.OriginalSource + " " + " Event: " + e.RoutedEvent; lstMessages.Items.Add(message); e.Handled = (bool)chkHandle.IsChecked; } private void cmdClear_Click(object sender, RoutedEventArgs e) { eventCounter = 0; lstMessages.Items.Clear(); } } }