深入显出WPF 第二部分(15)

深入浅出WPF 第二部分(15)

第8章 深入浅出话事件

8.1 近视WPF的树形结构

WPF中有两种"树":一种叫逻辑树(Logical Tree),一种叫可视元素树(Virtual Tree)。那么当一个路由事件被激发后是沿着Virtual Tree传递的。

8.2 事件的来龙去脉

事件模型的几个关键部分:

  • 事件的拥有者:myButton。
  • 事件:myButton.Click。
  • 事件的响应者:窗体本身。
  • 事件处理器:this.myButton_Click方法。
  • 订阅关系:可以在Form1.Designer.cs文件中找到一句代码是 this.buttonLogin.Click += new System.Windows.RoutedEventHandler(this.buttonLogin_Click);

8.3 深入浅出路由事件

8.3.1 使用WPF内置路由事件

    <Grid x:Name="gridRoot" Background="Lime">
        <Grid x:Name="gridA" Margin="10" Background="Blue">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Canvas x:Name="canvasLeft" Grid.Column="0" Background="Red" Margin="10">
                <Button x:Name="buttonLeft" Content="Left" Width="40" Height="100" Margin="10"/>
            </Canvas>
            <Canvas x:Name="canvasRight" Grid.Column="1" Background="Yellow" Margin="10">
                <Button x:Name="buttonRight" Content="Right" Width="40" Height="100" Margin="10"/>
            </Canvas>
        </Grid>
    </Grid>

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.ButtonClicked));
        }

        private void ButtonClicked(object sender, RoutedEventArgs e)
        {
            MessageBox.Show((e.OriginalSource as FrameworkElement).Name);
        }
    }

e.OriginalSource:查看事件的源头。


为元素添加路由处理器的事情在XAML中也可以完成,只需要把XAML代码改成这样即可:

    <Grid x:Name="gridRoot" Background="Lime" ButtonBase.Click="ButtonClicked">
        <Grid x:Name="gridA" Margin="10" Background="Blue">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Canvas x:Name="canvasLeft" Grid.Column="0" Background="Red" Margin="10">
                <Button x:Name="buttonLeft" Content="Left" Width="40" Height="100" Margin="10"/>
            </Canvas>
            <Canvas x:Name="canvasRight" Grid.Column="1" Background="Yellow" Margin="10">
                <Button x:Name="buttonRight" Content="Right" Width="40" Height="100" Margin="10"/>
            </Canvas>
        </Grid>
    </Grid>