单击具有较低 ZOrder 且不使用 IsHitTestVisible 的 WPF 元素

Click on WPF Element with lower ZOrder and without using IsHitTestVisible

为了简化问题,我有以下 XAML Windows :

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    DataContext="{StaticResource MainViewModel}">
<Grid>
    <Button Click="Button_Click">Click Me</Button>
    <ListBox ItemsSource="{Binding Items}" Background="{x:Null}">
    </ListBox>
</Grid>
</Window>

它运行时看起来像这样:

我期望的是:

但是我无法点击按钮,列表框中只有 select 项。 注意:如果我使用 IsHitTestVisible,我可以单击按钮,但不能再单击项目,这是有道理的。我也绝对需要让列表框和按钮占据整个 windows。将列表框放在顶部和按钮放在底部不是解决方案。

有什么好的方法可以让它发挥作用吗?

感谢您的帮助!

您可以尝试将列表框和按钮放在 StackPanel

此外,您的按钮似乎没有绑定到任何操作,这可能是原因:)?

如果您希望列表框位于按钮顶部并部分覆盖按钮,另一种选择是在列表框上设置 `VerticalAlignment="Top"。这将允许列表框垂直增长,只有列表框的高度会覆盖按钮。但是,如果列表框有很多项目,那么它会完全覆盖按钮,您将无法点击按钮。

您始终可以在列表框上添加 PreviewMouseDown 处理程序并触发按钮单击或命令。这样,如果列表框填满整个 window,您仍然可以触发按钮处理程序。

看看这个帖子:Canvas in ScrollViewer (Preview)MouseButtonDown event order

问题出在处理鼠标事件的 ScrollViewer 上。您可以实现您的自定义 ListBox 模板并使用派生的自定义 ScrollViewer class 以及上述线程中显示的代码更改。

感谢 dotsven,设置 handle=false 对我不起作用,但我发现这个问题对我有帮助:。从中获得灵感,我通过为我的 listbox 设置新样式删除了 ScrollViewer 并且它起作用了:

<Style x:Key="{x:Type ListBox}" TargetType="ListBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我还必须将背景保持为 {x:Null} :

<ListBox ItemsSource="{Binding Items}" Background="{x:Null}" Height="65" Width="242"/>

感谢大家的帮助!