例如我们有一个边框。这些XAML之间有什么区别?
1)背景=“透明”
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Border
BorderBrush="White"
BorderThickness="2"
Width="400"
Height="400"
Background="Transparent"
PointerPressed="Border_PointerPressed"
PointerReleased="Border_PointerReleased" />
</Grid>
2) Background =“{x:Null}”
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Border
BorderBrush="White"
BorderThickness="2"
Width="400"
Height="400"
Background="{x:Null}"
PointerPressed="Border_PointerPressed"
PointerReleased="Border_PointerReleased" />
</Grid>
这两个边界看起来都是一样的。但有什么区别?
答案 0 :(得分:3)
不同之处在于,如果我们设置 null 背景,边框将不支持点击测试,这就是为什么路由事件,如PonterPressed 将不会被提升。
相反,如果我们设置透明背景事件将被提升。
为了说明这一点,让我们编写代码隐藏。
using Windows.UI.Xaml.Media;
namespace App1 {
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
}
void Border_PointerPressed(object sender, PointerRoutedEventArgs e) {
Border border = sender as Border;
if (border != null)
border.Background = new SolidColorBrush(Colors.Red);
}
void Border_PointerReleased(object sender, PointerRoutedEventArgs e) {
Border border = sender as Border;
if (border != null)
border.Background = new SolidColorBrush(Colors.Transparent);
}
}
}
1)让我们使用第一个XAML,编译我们的应用程序并运行它。尝试点击广场内部。方块变为红色,因为事件升级并且处理程序调用。
2)现在让我们使用第二个XAML,编译应用程序,运行它,点击方块内部。没有任何事情发生,因为事件没有发生。处理程序不是调用。
答案 1 :(得分:1)
为了完整起见,我发现此链接http://msdn.microsoft.com/en-us/library/hh758286.aspx#hit_testing解释得相当好 - 请特别注意第二个要点:
点击测试和输入事件
确定UI中元素是否可见,以及鼠标是否可见 触摸和手写笔输入称为命中测试。用于触摸操作和 也适用于特定于交互的事件或操纵事件 触摸动作的后果,元素必须是可见的 命令成为事件源并触发关联的事件 随着行动。否则,操作将通过元素传递给 可视化树中的任何底层元素或父元素 可以与该输入进行交互。有几个因素会影响 命中测试,但您可以确定给定元素是否可以触发 通过检查其IsHitTestVisible属性来输入事件。这个性质 仅当元素满足以下条件时才返回true:
- 元素的Visibility属性值为Visible。
- 元素的Background或Fill属性值不为null。空刷子值会导致透明度和命中测试不可见性。的(要 使元素透明但也可以测试,使用透明 刷而不是null。)注意背景和填充不是由 UIElement,而是由不同的派生类定义 作为控制和形状。但是你使用的刷子的含义 命中测试和前景和背景属性是相同的 输入事件,无论哪个子类实现属性。
- 如果元素是控件,则其IsEnabled属性值必须为true。
- 元素在布局中必须具有实际尺寸。 ActualHeight和ActualWidth为0的元素不会触发输入事件。