SanSolo
SanSolo

Reputation: 2373

Wpf event not bubbling

Here is my XAML:

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="844.025" Width="678"  MouseUp="somethingClicked">
<Grid MouseUp="somethingClicked">
    <StackPanel MouseUp="somethingClicked" Margin="0,0,10,0">
    <Button x:Name="btnClickMe" Content="Click Me!" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="101,22,0,0" MouseUp="somethingClicked"/>
        <CheckBox x:Name="chkhandle" Content="CheckBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="241,28,0,0" RenderTransformOrigin="-0.588,1.188"/>
        <ListBox x:Name="lstEvents" HorizontalAlignment="Left" Height="604" VerticalAlignment="Top" Width="416" Margin="29,66,0,0"/>
    </StackPanel>
</Grid>

And here is the C# Code:

namespace WpfApplication4
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    protected int eventCounter = 0;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void somethingClicked(object sender, RoutedEventArgs e)
    {
        eventCounter++;

        String message = "#" + eventCounter.ToString() + ":\r\n" +
            " Sender: " + sender.ToString() + ":\r\n" +
            " Source: " + e.Source + ":\r\n" +
            " Original Source: " + e.OriginalSource;

        lstEvents.Items.Add(message);
        e.Handled = (bool) chkhandle.IsChecked;

        if (e.Handled)
            lstEvents.Items.Add("Completed");   

    }
}

}

I have the following issues with this example: 1)The MouseUp event is not fired on clicking the button. 2)The event doesn't bubble up. Clicking somewhere on the form displays:

Sender:WpfApplication4.MainWindow:
Source:WpfApplication4.MainWindow:
Original Source: System.Windows.Controls.Border.

If I understand rightly, when button is clicked, first it should be executed at Window level (which it does now), then Grid, then stack and finally text label. Is the code wrong or is my understanding of the concept faulty?

Upvotes: 6

Views: 5853

Answers (4)

makc
makc

Reputation: 2579

Microsoft wrote a very nice explanation Routed Events Overview

enter image description here

exactly the same thing will happen with MouseUpand PreviewMouseUp events in your case the e.Handled = (bool) chkhandle.IsChecked; stops the routing of the event.

if you want to debug the events you can use Snoop it will illustrate very nicely which events happened on which objects and who handled them.

Upvotes: 1

Eternal21
Eternal21

Reputation: 4694

There is an override available to handle events, even though they were marked as handled. It requires that you add your handler through code as the following:

MainWindow.AddHander(UIElement.MouseUpEvent, new MouseButtonEventHandler(button1_MouseUp), true);

That last parameter specifies whether you want to accept events that were handled already or not. If you add that handler to your main window, you'll notice that the routed MouseUp events from your button are indeed bubbling up, (but their e.Handled indicates that they were already handled).

Upvotes: 0

Anatoliy Nikolaev
Anatoliy Nikolaev

Reputation: 22702

The MouseUp event is not fired on clicking the button.

Because the first fires is an event at the Button.Click, and when it works, it conflicts with the event MouseUp. Quote from here:

ButtonBase inherits from UIElement, a Button will also have access to all of the mouse button events defined for UIElement. Because the Button does something in response to button presses, it swallows the bubbling events (e.g. MouseLeftButtonDown and MouseDown). You can still detect these lower level button press events by adding handlers for the tunneling events (e.g. PreviewMouseLeftButtonDown and PreviewMouseDown).

Try to replace the Button on Label, and you'll get the desired result:

enter image description here

Upvotes: 6

Vimal CK
Vimal CK

Reputation: 3563

  1. Try handling the PreviewMouseDown event instead. You can still attach that from XAML. In your handler

  2. Attach the event handler in code instead. Use the signature of AddHandler

.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        Grid1.MouseUp += new MouseButtonEventHandler(Grid1_MouseUp);
}
private void Grid1_MouseUp(object sender, MouseButtonEventArgs e)
{
        MessageBox.Show("Mouseup");
}

Upvotes: 1

Related Questions