WPF学习笔记——8)路由事件

路由事件是一种具有更强传播能力的事件,可以双向传播。

路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件,当路由事件触发后,它可以向上或向下遍历,不需要任何定制的代码。

路由事件的三种方式

1、直接路由事件

与传统的.Net事件是非常类似的,都是用于一个元素,并且不能够传递给其他元素。

2、冒泡路由事件

是一种在元素树中向上传递的事件,事件首先由某个元素引发,然后向上传递给父元素处理事件,直到元素树的顶部。

我们可以用一个简单的程序测试一下冒泡路由事件的传播路径:

<Window x:Class="_08.Routing_event.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        MouseUp="SomethingClicked">
    <Grid MouseUp="SomethingClicked">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <Label MouseUp="SomethingClicked" Margin="5" BorderThickness="2">
            <StackPanel MouseUp="SomethingClicked">
                <TextBox MouseUp="SomethingClicked" Margin="5">图像</TextBox>
                <Image MouseUp="SomethingClicked" Source="E:/1 program/2Graduate Courses/lab/WPF/08.Routing event/Images/CUG.png" Stretch="None" Margin="5"></Image>
                <TextBox MouseUp="SomethingClicked" Margin="5">图像</TextBox>
            </StackPanel>
        </Label>


        <ListBox Margin="5" Name="ListMessages" Grid.Row="1"></ListBox>
        <CheckBox Margin="5" Name="CheckHandle" Grid.Row="2">事件处理</CheckBox>
        <Button Click="cmdClear_Click" Margin="5" Grid.Row="3" HorizontalAlignment="Right" >清除</Button>
    </Grid>
</Window>

 我们在Grid网格中分了4行,结构如下

  • Grid
    • Lable
      • StackPanel
        • TextBox
        • Image
        • TextBox
    • ListBox
    • CheckBox
    • Button

我们在Gird、Lable、StackPanel、Image中分别设置了鼠标点击时的响应函数,因为点击鼠标左键是一个冒泡路由事件,我们在响应函数处理时可以输出当前处理元素的一些信息,这样我们就可以清楚地看到冒泡路由事件的处理顺序了

        private void SomethingClicked(object sender, RoutedEventArgs e)
        {
            eventcount++;
            string message = "#" + eventcount.ToString() + ":\r\n" +
                "Sender:" + sender.ToString() + ":\r\n" +
                "Source:" + e.Source + ":\r\n" +
                "Original Source:" + e.OriginalSource;
            ListMessages.Items.Add(message);
            e.Handled = (bool)CheckHandle.IsChecked;
        }

        private void cmdClear_Click(object sender, RoutedEventArgs e)
        {
            eventcount = 0;
            ListMessages.Items.Clear();
        }

 同样我们对按钮清除也设置一个响应函数,用来清除ListBox的信息。

我们点击Image图标,然后可以看输出结果:

 

3、隧道路由事件

是一种在元素树中向下传递的事件,与冒泡路由事件方向相反。

一般的,隧道路由事件有Preview前缀,比如PreviewKeyDown,和冒泡路由事件是成对定义出现的。

一般的,将隧道路由事件的Preview前缀去掉,即可变为一个冒泡路由事件。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读