C#入门经典(第7版):C# 6.0 & Visual Studio 2015(.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

8.3 桌面应用程序中的OOP

第2章在C#中使用Windows Presentation Foundation(WPF)创建了一个简单的桌面应用程序。WPF桌面应用程序非常依赖OOP技术,本节将论述OOP技术,说明本章的一些论点。下面通过一个简单示例加以说明。

试一试:使用对象:Ch08Ex01

(1)在C:\BegVCSharp\Chapter08目录中创建一个新的WPF应用程序Ch08Ex0l。

(2)使用Toolbox添加一个新的按钮控件,使其位于MainWindow的中央,如图8-12所示。

图8-12

(3)双击按钮,为鼠标单击事件添加代码。修改代码,如下所示:

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
          ((Button)sender).Content = "Clicked! ";
          Button newButton = new Button();
          newButton.Content = "New Button! ";
          newButton.Margin = new Thickness(10, 10, 200, 200);
          newButton.Click += newButton_Click;
          ((Grid)((Button)sender).Parent).Children.Add(newButton);
        }
        private void newButton_Click(object sender, RoutedEventArgs e)
        {
          ((Button)sender).Content = "Clicked! ! ";
        }

(4)运行应用程序,窗口如图8-13所示。

图8-13

(5)单击标记为Button的按钮,显示内容将随之变化,如图8-14所示。

图8-14

(6)单击标记为New Button!的按钮,显示内容将随之变化,如图8-15所示。

图8-15

示例说明

仅添加几行代码,就创建了一个可以完成某项任务的桌面应用程序。下面说明C#中的一些OOP技术。即使在谈到桌面应用程序时,“一切皆对象”这句话也是正确的。从运行的窗体,到窗体上的控件,都需要使用OOP技术。这个示例重点说明本章前面介绍的一些概念,解释如何把它们组合在一起。

在应用程序中,首先在MainWindow窗口中添加一个新按钮,这个按钮是一个对象,它是Button类的一个实例;窗口是MainWindow类的实例,该类从Window类派生而来。接着双击按钮,添加一个事件处理程序,监听Button类提供的Click事件。这个事件处理程序被添加到封装应用程序的MainWindow对象代码中,是一个私有方法:

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
        }

这段代码使用C#关键字private作为修饰符。现在不要考虑这个关键字,第9章将详细解释本章提及的OOP技术。

我们添加的第一行代码改变了所单击按钮上的文本。它利用了本章前面讨论的多态性。表示按钮的Button对象作为一个object参数发送给事件处理程序,该事件处理程序把参数强制转换为Button类型(这是可能的,因为Button对象继承于System.Object, System.Object是一个.NET类,object是其别名)。然后修改对象的Content属性,改变显示的文本:

        ((Button)sender).Content = "Clicked! ";

接着用new关键字创建一个新的Button对象(注意在这个项目中设置了名称空间,因此可以使用这个简单的语法,否则就需要使用这个对象的完整限定名System.Windows.Forms.Button):

        Button newButton = new Button();

还可以将新建的Button对象的Content和Margin属性设置为合适的值,使按钮显示在合适的地方。注意,Margin属性的类型是Thickness,因此使用非默认构造函数创建一个Thickness对象,然后将其赋值给Margin属性:

        newButton.Content = "New Button! ";
        newButton.Margin = new Thickness(10, 10, 200, 200);

在代码的其他地方添加一个新的事件处理程序,以响应新按钮生成的Click事件:

        private void newButton_Click(object sender, RoutedEventArgs e)
        {
          ((Button)sender).Content = "Clicked! ! ";
        }

接着使用重载运算符语法,把这个事件处理程序注册为Click事件的监听程序:

        newButton.Click += newButton_Click;

最后,把新按钮添加到窗口中。为此,使用已有按钮的Parent属性找出其父对象,将其转换为正确类型,即Grid。然后,通过将新按钮作为参数传递给Grid.Children属性的Add()方法,将该按钮添加到窗口中:

        ((Grid)((Button)sender).Parent).Children.Add(newButton);

这些代码实际上没有看起来那样复杂。一旦理解了WPF是通过一个控件(包括按钮和容器)的层次结构来显示窗口的内容,使用这类代码就显得再自然不过。

这个简短示例几乎使用了本章介绍的所有技术。可以看出,OOP编程并不复杂—— 只需要从另一个角度来看待编程即可。