在XAML代码中为节点树安装事件监听器

通过下面的示例代码,可以发现,我们能为任意的节点指定要监听的路由事件,而这个路由事件本身和这个元素可能根本就没有关系。
<Window x:Class="Demo002.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Demo002"
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="Grid1" local:TimeButton.ReportTime="ReportTimeHandler">
        <Grid x:Name="Grid2" local:TimeButton.ReportTime="ReportTimeHandler">
            <Grid x:Name="Grid3" local:TimeButton.ReportTime="ReportTimeHandler">
                <StackPanel x:Name="StackPanel1" local:TimeButton.ReportTime="ReportTimeHandler">
                    <ListBox x:Name="ListBox1" />
                    <local:TimeButton x:Name="TimeButton1" Width="80" Height="80" 
                                      Content="Report Time"
                                      local:TimeButton.ReportTime="ReportTimeHandler"/>
                </StackPanel>
            </Grid>
        </Grid>
    </Grid>
</Window>

当ReportTime的路由事件被触发之后,该事件会沿着树进行传递,如果到了某个节点我们已经把该事件处理了,并且无需继续往上传递,则可以通过其参数e.Handled=true来控制其无需继续传递下去了。如下代码所示:
private void ReportTimeHandler(object sender, ReportTimeEventArgs e)
{
    FrameworkElement element = sender as FrameworkElement;
    string content = string.Format("{0}到达{1}", e.ClickTime.ToLongTimeString(), element.Name);
    this.ListBox1.Items.Add(content);


    if (element == this.Grid2) { e.Handled = true; }
}

按照上面的代码,当路由事件传递给Grid2的时候,就被标记为已经处理了,这样路由事件就不会再传递给Grid1了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值