【问题标题】:Click on WPF Element with lower ZOrder and without using IsHitTestVisible单击 ZOrder 较低且不使用 IsHitTestVisible 的 WPF 元素
【发布时间】:2015-07-28 20:45:54
【问题描述】:

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

<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>

当它运行时,它看起来像这样:

我的期望是:

  • 我可以选择项目 (WpfApplication1.BusinessObject)
  • 还可以点击按钮(因为我将背景标记为 {x:Null})

但我不能点击按钮,只能选择列表框中的项目。 注意:如果我使用 IsHitTestVisible,我可以单击按钮,但不能单击项目,这是有道理的。我还绝对需要让列表框和按钮都占据整个窗口。在列表框顶部和底部按钮不是解决方案。

有没有什么好办法让它工作?

感谢您的帮助!

【问题讨论】:

  • 您只是将控件层叠在一起。尝试使用堆栈面板或在网格中添加一些行,然后将列表框分配给一行,将按钮分配给另一行。

标签: c# wpf xaml z-order


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,其实是绑定了简单的Click事件。但正如我所提到的,我希望 Button 和 lisbox 都完全填充 Windows,一个在另一个之上(Z 顺序)。样本是从复杂的应用程序中提取的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    【解决方案4】:

    感谢dotsven,设置handle=false 对我不起作用,但我发现这个问题对我有帮助:Click through ListBox to underlying Control。从中汲取灵感,我通过为我的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"/>
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      相关资源
      最近更新 更多