单击具有较低 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 项 ( WpfApplication1.BusinessObject )
- 并且还可以点击按钮(因为我将背景标记为 {x:Null})
但是我无法点击按钮,列表框中只有 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"/>
感谢大家的帮助!
为了简化问题,我有以下 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 项 ( WpfApplication1.BusinessObject )
- 并且还可以点击按钮(因为我将背景标记为 {x:Null})
但是我无法点击按钮,列表框中只有 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"/>
感谢大家的帮助!