WPF MouseDown event not firing everywhere in a control
<StackPanel Background="Transparent" ... >
or
<Border Background="Transparent" ... >
should do the trick...
This makes the grid transparent, however visible for mouse-clicks.
Look here form more Information.
There are some other circumstances, where you have to use the PreviewXXX
- event, this is when a child element "swallows" the event away, but in your case, the above should be what you're looking for.
Comments
-
Damascus almost 2 years
I am currently fighting against another WPF struggle, namely mouse events.
I basically have a very simple control (a
Border
containing aGrid
which itself has a fewTextBlocks
). I am trying to achieve a simple behavior: Double click should turn the control into edit mode (which in fact hides theTextBlocks
withTextBoxes
bound to the same data.Nothing fancy, right? Well still, I'm struggling. The
MouseDoubleClick
linked to myUserControl
just fires when I click in a control (like, clicking ON aTextBlock
). If I click on an empty space betweenTextBlocks
, nothing is fired. Not evenMouseDown
.How could I make it work so as to catch every mouse click? I assumed that linking a
MouseDown
event to aBorder
should catch every click on the border but... it ended up not catching clicks on empty parts of the border.Here is some draft code I made for you to run it:
XAML:
<StackPanel Orientation="Vertical"> <Border Height="400" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="Black" BorderThickness="2" MouseDown="Border_MouseDown" MouseUp="Border_mouseUp"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </Border> <TextBlock Height="100" Width="300" HorizontalAlignment="Center" TextAlignment="Center" x:Name="thetext" Visibility="Collapsed" Foreground="White" Background="Red" Text="CLICKED!" /> </StackPanel>
Code behind:
private void Border_MouseDown(object sender, MouseButtonEventArgs e) { thetext.Visibility = Visibility.Visible; } private void Border_mouseUp(object sender, MouseButtonEventArgs e) { thetext.Visibility = Visibility.Collapsed; }
Now try to click one of the "BLUFF" texts: A "CLICKED" Text will appear. Try clicking somewhere else, between the TextBlocks: Nothing happens.
Thank you!
-
Damascus about 10 yearsWell. That was unexpectedly easy - and stupid. Thanks for the quick answer. I've always thought default background color was Transparent. Thanks a lot! There goes one day of WPF fighting