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编程并不复杂—— 只需要从另一个角度来看待编程即可。