[源自Silverlight tutorial]
这篇文章,介绍Silverlight应用中的事件处理和动态创建控件。
1、我们先来看一个例子:
<UserControl x:Class="SLDemo.EventDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Canvas Loaded="Canvas_Loaded"> <Button x:Name="myButton" Content="Hello" Canvas.Left="10" Canvas.Top="10"></Button> </Canvas> </UserControl>
注意以x:作为前缀的属性,如:x:Class、x:Name,这些都是编程构造,也就是说他们都可以进行相关的程序编码。
x:Class:配置 XAML 编译以便在标记与代码隐藏之间联接分部类,它由命名空间和类名组成,所有的事件处理都在这个对应的文件中进行。
x:Name:控件的唯一标记。
在这个例子中,我们通过XAML为Canvas控件定义了一个事件处理,实际上这是一个事件委托,我们将Canvas_Loaded绑定到Loaded事件。
然后看一下在cs文件中的处理(在XAML文件中选择事件名称,右键就可以定位到事件处理):
private void Canvas_Loaded(object sender, RoutedEventArgs e) { myButton.Content = "Please Click Me"; }
这段代码的意思是,当Canvas加载的时候,将myButton控件的Content设置为Please Click Me。
在设计时的时候我们可以看到,myButton控件上显示的是Hello,但当我们运行这个程序的时候,显示已经变为Please Click Me,并且控件能够自动适应文本的内容,显示良好的界面。
在这种事件声明方式中,在XAML文件中,指定了方法的名称(没有参数),以及绑定到的事件。
同时在对应的cs文件中,添加了符合.NET事件处理格式的方法,这个方法对应XAML文件中指定的方法名。
第一个参数指定了触发这个事件的对象,第二个参数是一个EventArgs类型或者一个继承了EventArgs的类型,这里是RoutedEventArgs。
2、除了这种定义事件处理的方式,还可以在代码中直接定义
在xaml中定义如下:
<UserControl x:Class="SLDemo.EventDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Canvas> <Button x:Name="myButton" Content="I'm Indented!" Canvas.Left="150" Canvas.Top="20" /> </Canvas> </UserControl>
一个Button控件。
接下来,在CS文件中添加事件委托,可以使用代码提示功能来完成输入。
public partial class EventDemo : UserControl { public EventDemo() { InitializeComponent(); //绑定一个方法EventDemo_Loaded到Loaded事件 Loaded += new RoutedEventHandler(EventDemo_Loaded); } //在这个方法中,为myButton控件的Click事件做了一个绑定 void EventDemo_Loaded(object sender, RoutedEventArgs e) { myButton.Click += new RoutedEventHandler(myButton_Click); } //Click后要执行的方法,已绑定 void myButton_Click(object sender, RoutedEventArgs e) { myButton.Content = "Have Clicked!"; } }
现在可以运行以查看效果。
3、在Silverlight 2中,所有的XAML控件与CLR对象同构,所以完全可以在代码中来创建这些控件。
我们在XAML中可以这样写:
<Button x:Name="myButton" Content="Hello" />
在代码中,可以这样定义:
Button myButton = new Button(); myButton.Content = "Hello";
它们的效果是一样的。
大多数情况下,推荐使用XAML来定义控件,可以更方便的创建、修改和控制。
当你在设计时不清楚将创建哪些控件时,你可以使用动态创建控件。
看一个例子:
public partial class EventDemo : UserControl { private int newButtonPosition = 100; public EventDemo() { InitializeComponent(); //Anthor按钮单击事件 Another.Click += new RoutedEventHandler(Another_Click); } //Anthor按钮单击后,执行方法 void Another_Click(object sender, RoutedEventArgs e) { //创建一个Button Button b = new Button(); //显示内容 b.Content = "I live!"; //为新创建的控件新建Thickness对象,用来设置Button控件的位置 //原文中使用了Canvas.LeftProperty和Canvas.TopProperty Thickness tn = new Thickness(10,this.newButtonPosition,0,0); b.SetValue(Canvas.StyleProperty, tn); //到顶部的距离递增 this.newButtonPosition += 30; b.Width = 100; b.Height = 20; //给这个新建的按钮的Click事件添加一个处理方法 b.Click += new RoutedEventHandler(b_Click); //添加到父控件,并显示 myCanvas.Children.Add(b); } //点击添加的控件触发 void b_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; btn.Content = "Don't do that!"; btn.IsEnabled = false; } }
由于没有截图,请自己运行查看效果。
OK,这篇文章到此结束。
关键字: Silverlight 事件处理 动态控件
this.newButtonPosition += 30;
==========================
这一步不明白, 这个可以设置按钮的位置吗?
Thickness用来描述矩形周围框架的粗细,我理解为margin,四个值分别为left、top、right、bottom。
这里使用:
Thickness tn = new Thickness(10,this.newButtonPosition,0,0);
然后设置:
this.newButtonPosition += 30;
意思是这个新按钮的top margin在当前点击按钮的基础上在加30。
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论