我认为这个问题的关键是什么是“被认为对命中测试不可见的元素”。
我认为当我们设置IsHitTestVisible
为时false
,该元素不被认为是不可见的,它只是不可见的。并且根据命中测试和输入事件,满足以下条件的元素是可命中测试的。
- 元素的Visibility属性值为Visible。
- 元素的Background或Fill属性值不为 null。一个空的 Brush值会导致透明度和命中测试不可见。(要使元素透明但也可测试,请使用透明画笔而不是null。)
- 如果元素是控件,则其IsEnabled属性值必须为true。
- 元素在布局中必须具有实际尺寸。ActualHeight和ActualWidth为 0的元素不会触发输入事件。
所以我认为当一个元素的Visibility
属性值为Collapsed
or its Background
or Fill
property value is null
or its IsEnabled
property value isfalse
时,该元素被认为是不可见的。我做了一个简单的测试。
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Border Name="Border" Width="200" Height="300" BorderThickness="1" BorderBrush="Black" Background="AliceBlue">
<Grid Name="Grid" Width="100" Height="250">
<Rectangle Name="CollapsedRectangle" Fill="Azure" Visibility="Collapsed" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" />
<Rectangle Name="NoFillRectangle" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,100,0,0" />
<Button Name="Button" IsEnabled="False" VerticalAlignment="Top" Margin="0,200,0,0">CLICK</Button>
</Grid>
</Border>
</Grid>
public MainPage()
{
this.InitializeComponent();
CoreWindow.GetForCurrentThread().PointerMoved += (s, e) =>
{
Point point = e.CurrentPoint.Position;
IEnumerable<UIElement> elements = VisualTreeHelper.FindElementsInHostCoordinates(point, Border, false);
foreach (var item in elements)
{
FrameworkElement feItem = item as FrameworkElement;
System.Diagnostics.Debug.WriteLine(feItem.Name);
}
System.Diagnostics.Debug.WriteLine("-----------------------------------------");
};
}
当includeAllElements
参数设置为false
时,输出类似于
Border
-----------------------------------------
Border
-----------------------------------------
Border
-----------------------------------------
当includeAllElements
参数设置为true
时,输出就像
Border
-----------------------------------------
Grid
Border
-----------------------------------------
...
NoFillRectangle
Grid
Border
-----------------------------------------
...
Grid
Border
-----------------------------------------
Border
-----------------------------------------
所以似乎参数只有在元素或属性值为includeAllElements
时才生效。不确定这是否是设计使然。也许只有其或属性值被认为是不可见的元素。Background
Fill
null
Background
Fill
null