[源自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大全
文章分类
最新评论