WPF控件中MouseDown事件不在所有位置都触发

34

我目前正在与另一个 WPF 难题——鼠标事件——作斗争。

我基本上有一个非常简单的控件(一个包含一个 GridBorder,它本身有一些 TextBlocks)。我试图实现一个简单的行为:双击应该将控件切换到编辑模式(实际上是隐藏了 TextBlocks 并显示绑定到相同数据的 TextBoxes)。

没什么花哨的东西,对吧?但我还是在苦苦挣扎。链接到我的 UserControlMouseDoubleClick 事件只会在我点击控件内部时触发(比如,在 TextBlock 上点击)。如果我在 TextBlocks 之间的空白区域点击,则什么都不会触发,甚至没有 MouseDown

我怎样才能使其每次鼠标点击都被捕获呢?我假设将 MouseDown 事件链接到 Border 上就可以捕获边框上的每次点击,但事实证明这并不能捕获边框的空白部分的点击。

以下是我为您编写的一些示例代码:

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>

后台代码:

private void Border_MouseDown(object sender, MouseButtonEventArgs e)
{
    thetext.Visibility = Visibility.Visible;
}

private void Border_mouseUp(object sender, MouseButtonEventArgs e)
{
    thetext.Visibility = Visibility.Collapsed;
}
现在尝试点击其中一个“BLUFF”文本:会出现一个“CLICKED”文本。尝试在TextBlocks之间的其他地方点击:不会发生任何事情。
谢谢!
1个回答

55
<StackPanel Background="Transparent" ... >
或者
<Border Background="Transparent" ... >

这应该能解决问题...

这会使网格透明,但对于鼠标单击可见。

这里查找更多信息。

还有一些其他情况需要使用PreviewXXX事件,比如子元素“吞噬”事件,但在你的情况下,上述内容应该是你要寻找的。


8
好的,那真是意料之外的轻松 - 也有些愚蠢。谢谢你快速回答。 我一直认为默认背景颜色是透明的。非常感谢!这样我的 WPF 就省去了一天的折磨。 - Damascus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接