背景或填充中的空刷和透明刷之间有什么区别

时间:2013-12-19 08:42:12

标签: xaml windows-8 windows-store-apps winrt-xaml

例如我们有一个边框。这些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>

这两个边界看起来都是一样的。但有什么区别?

2 个答案:

答案 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的元素不会触发输入事件。
  •