《Practical WPF Charts and Graphics 》翻译——之六
来源:互联网 发布:怎么做淘宝店供应商 编辑:程序博客网 时间:2024/05/20 14:43
后台代码文件中的事件处理器
在前面部分,你学习了怎么去将特性和相应属性联系到一起。然而,为了使控件工作你可能有时需要给特性添加时间处理器。在前面的XAML文件中,你必须添加一个OnTextChanged事件处理器到TextBox.的TextChanged属性上。你也必须使用两个click事件处理器定义两个按钮的Click属性:btnChangeColor_Click和 btnChangeSize_Click。
假定这在后台代码文件中是叫做OnTextChanged,btnChangeColor_Click和 btnChangeSize_Click的方法。下面是这个例子的相应的后台代码文件:
using System;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Media; namespaceWPFOverview{ public partial class FirstWPFProgram :Window { public FirstWPFProgram () { InitializeComponent(); } private void OnTextChanged(objectsender, TextChangedEventArgs e) { textBlock.Text = textBox.Text; } private void btnChangeColor_Click(objectsender, RoutedEventArgs e) { if (textBlock.Foreground ==Brushes.Black) textBlock.Foreground =Brushes.Red; else textBlock.Foreground =Brushes.Black; } private void btnChangeSize_Click(objectsender, RoutedEventArgs e) { if (textBlock.FontSize == 11) textBlock.FontSize = 24; else textBlock.FontSize = 11; } }}
注意事件处理器必须有正确的签名。WPF里的事件模型和先前版本的.NET有轻微的差别。WPF支持一个新的基于事件路由的模型。前面代码的其他部分和你熟悉的Windows Forms应用程序中使用的类似。
运行这个例子将生成图1-1里显示的结果。如果你在文本框里输入任何文字,
text block将显示相同的文字。另外,颜色和字体大小将由哪个按钮被点击决定。
只含代码的例子
前面提到,XAML在 创建WPF程序的时候不是必须的。WPF完全支持只含代码的实现,尽管这个用法很不常见。只含代码的实现有利有弊。只含代码的方法的一个好处就是它让你可以完全控制定制。举个例子,当你想根据用户的输入条件性地添加或者替换控件时,你可以在代码里轻易地实现条件逻辑。这在XAM里是很困难的,因为XAML里的控件被作为固定不变的资源地嵌入到你的程序集里。一个坏处就是既然WPF控件不包括含参数的构造器,在WPF中开发一个只含代码的应用程序是很枯燥的。即使是添加一个简单的控件,比如一个按钮,到你的应用程序中需要多行代码。
在下面的例子中,我们将前面的例子,FirstWPFProgram,转换成一个只含代码的应用程序。打开WPFOverview项目,添加一个WPF Window,命名为CodeOnly。打开CodeOnly.xaml文件,从Window中移除Grid控件。文件应该看起来像下面:
<Windowx:Class="WPFOverview.CodeOnly" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"></Window>
打开后台代码文件,CodeOnly.xaml.cs,添加下面的代码到文件中:
using System;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Media; namespaceWPFOverview{ public partial class CodeOnly : Window { private TextBlock textBlock; private TextBox textBox; public CodeOnly() { InitializeComponent(); Initialization(); } private void Initialization() { // Configure the window: this.Height = 300; this.Width = 300; this.Title = "Code OnlyExample"; // Create Grid and StackPanel andadd them to window: Grid grid = new Grid(); StackPanel stackPanel = newStackPanel(); grid.Children.Add(stackPanel); this.AddChild(grid); // Add a text block to stackPanel: textBlock = new TextBlock(); textBlock.Margin = new Thickness(5); textBlock.Height = 30; textBlock.TextAlignment =TextAlignment.Center; textBlock.Text = "HelloWPF!"; stackPanel.Children.Add(textBlock); // Add a text box to stackPanel: textBox = new TextBox(); textBox.Margin = new Thickness(5); textBox.Width = 200; textBox.TextAlignment =TextAlignment.Center; textBox.TextChanged += OnTextChanged; stackPanel.Children.Add(textBox); // Add button to stackPanel used tochange text color: Button btnColor = new Button(); btnColor.Margin = new Thickness(5); btnColor.Width = 200; btnColor.Content = "Change TextColor"; btnColor.Click +=btnChangeColor_Click; stackPanel.Children.Add(btnColor); // Add button to stackPanel used tochange text font size: Button btnSize = new Button(); btnSize.Margin = new Thickness(5); btnSize.Width = 200; btnSize.Content = "Change TextColor"; btnSize.Click += btnChangeSize_Click; stackPanel.Children.Add(btnSize); } private void OnTextChanged(object sender, TextChangedEventArgs e) { textBlock.Text = textBox.Text; } private voidbtnChangeColor_Click(object sender, RoutedEventArgs e) { if (textBlock.Foreground ==Brushes.Black) textBlock.Foreground =Brushes.Red; else textBlock.Foreground =Brushes.Black; } private void btnChangeSize_Click(objectsender, RoutedEventArgs e) { if (textBlock.FontSize == 11) textBlock.FontSize = 24; else textBlock.FontSize = 11; } }}
这个代码列表将产生和图1-1中显示的相同结果。
你可以看到CodeOnly类和传统的Windows Forms类应用程序中的form类很相似。它从Window基类继承并为TextBlock和TextBox添加了私有成员变量。注意控件怎么被添加到他们的父母和事件处理器是怎么添加的。
只含XAML的例子
在前面的部分中,你学习了怎么使用XAML加代码和只含代码的技术创建相同的WPF应用程序。标准的开发WPF程序的方法是同时使用XAML和后台代码文件。也就是说,你使用XAML去布局你的UI,使用代码区实现时间处理器。对于动态UI的应用程序,你可能想使用只含代码的方法。
但是,对于简单的应用程序,也可以使用只含XAML文件而不写任何C#代码的方法。乍一看,一个松散的XAML文件看似毫无用处——毕竟,没有代码的UI怎么去驱动它呢?然而,XAML提供了一些特性允许你不使用后台代码文件展示特定的功能。例如,你可以开发只含XAML文件的包含动画,事件触发器和数据绑定的应用程序。
这里我们模仿FirstWPFProgram例子创建一个松散的XAML应用程序。尽管它不能完美地产生如图1-1显示的结果,这个只含XAML的应用程序仍然产生了一个比HTML世界更令人印象深刻的结果。
添加一个WPF Window到WPFOverview项目中,命名为XAMLOnly。下面是这个例子的标记语句:
<Windowx:Class="WPFOverview.XAMLOnly" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1"Height="300" Width="300"> <Grid> <StackPanel> <TextBlock Name="textBlock"Margin="5" TextAlignment="Center" Height="30" Text="{BindingElementName=textBox,Path=Text}"/> <TextBoxName="textBox" Margin="5" Width="200" TextAlignment="Center"Text="Hello, WPF!"/> <Button Margin="5"Width="200" Content="Change TextColor"> <Button.Triggers> <EventTriggerRoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="textBlock" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" From="Black" To="Red"Duration="0:0:1"/> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button> <Button Margin="5"Width="200" Content="Change TextSize"> <Button.Triggers> <EventTriggerRoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="textBlock" Storyboard.TargetProperty="FontSize" From="11" To="24" Duration="0:0:0.2"/> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button> </StackPanel> </Grid></Window>
这个XAML文件首先将TextBlock的Text属性绑定到TextBox的Text属性上。这个数据绑定允许你通过在TextBox里输入文字来改变TextBlock的文字。接着创建了两个按钮,它们的功能是改变文字颜色和字体。这个可以通过按钮的事件触发器来做到,它开启了一个color animation和一个double animation,由按钮被点击决定。
尽管这个应用程序缺少后台代码文件,这些按钮仍能工作。当然,这个只含XAML的例子不能完全复制前面只含后台代码文件的例子。原因是尽管XAML文件里的事件触发器能开启一个动画,它们不能包含if语句,for循环和其他任何计算算法。
- 《Practical WPF Charts and Graphics 》翻译——之六
- 《Practical WPF Charts and Graphics 》翻译——之二
- 《Practical WPF Charts and Graphics 》翻译——之三
- 《Practical WPF Charts and Graphics 》翻译——之五
- 《Practical WPF Charts and Graphics 》翻译——之八
- 《Practical WPF Charts and Graphics 》翻译——之九
- 《Practical WPF Charts and Graphics 》翻译——之十
- 《Practical WPF Charts and Graphics 》翻译——之十一
- 《Practical WPF Charts and Graphics 》翻译——序
- 《Practical WPF Charts and Graphics 》翻译——之一
- 《Practical WPF Charts and Graphics 》翻译——之四——第1章
- 《Practical WPF Charts and Graphics 》翻译——之七——第2章
- 《Practical WPF Charts and Graphics 》翻译——之11章 曲线拟合(1)
- 《Practical WPF Charts and Graphics 》翻译——之11章 曲线拟合(2)
- Practical WPF Charts and Graphics WPF图表和图形 翻译和源代码
- Practical C# Charts and Graphics
- Practical WPF Graphics Programming
- Android API Guide for Animation and Graphics(六)—— 动画与图形(OpenGL ES)
- HDU 4001
- hibernate学习笔记(数据库事物,隔离级别)
- 《Practical WPF Charts and Graphics 》翻译——之五
- Bug 跟踪管理系统 Mantis 在 IIS5 下安装指南
- Drupal的工作原理
- 《Practical WPF Charts and Graphics 》翻译——之六
- 触摸屏代码分析——实现按下中断
- Android-点击两次退出
- MFC CListCtrl 锁定表头的方法
- 人们为什么要在微博、Facebook 等上发布自己的状态信息或者人生感悟?
- 简单的Jquery 插件编写
- adb server is out of date ADB server didn't ACK * failed to start daemon *一种解决方式
- drupal中的IOC控制反转模式
- 触摸屏代码分析——实现ADC转换完成中断