none
在x:Class中编写Event Handlers RRS feed

  • 常规讨论

  • 对于基于Silverligh的应用程序各种事件的处理,你有以下几个选择:

    你可以编写JavaScript 事件处理程序, 它是由 Silverlight browser control来解释运行的.

    你可以用针对托管代码的动态语言来编写事件处理程序, 比如象IronPython 或托管 JScript. 这些事件处理机制直到运行时才会被编译. dynamic language runtime (DLR)提供了托管代码的支持. 想查看更多详情, 请查阅 怎么样使用动态语言来编写Silverlight程序.

    你可以使用托管 代码 语言 比如 C# 或 Visual Basic. 这些处理程序将被编译到库中,你可以引用使用这些在XAML中运行的处理程序 .

    本章将介绍上面提到的第三种方法.介绍怎么使用C# 和 Visual Basic来编写事件处理程序 , 怎么编译它们到assembly里中, 怎么样引用XAML中的这些事件处理程序等.

    运行 查看 要求 (请查看Silverlight download site):

    Microsoft Silverlight 1.1 Alpha.

    Microsoft Visual Studio Code Name "Orcas" Beta 1.

    Microsoft Silverlight Tools Alpha for Visual Studio Code Name "Orcas" Beta 1.

    本章假设你已经创建好了一个基本的Silverlight project. (请查看 怎么来创建一个Silverlight Project 来获得信息.)

    声明 x:Class, 引用事件 Handler
    一个基于 Visual Studio Silverlight 模板的project将自动选择一个默认的class, namespace, 和 assembly. x:Class 一般都会被附加上了以上的值, 所以你可以跳过 step 1 而直接去看下面的内容. 但是, 你可能想改变模板给你的 class, namespace, 和 assembly 的名称. 以下的内容也将介绍在创建project后怎么去更改模板给定的默认名称.

    准备 XAML 文件
    打开 Page1.xaml 文件 进行编辑. 在 Canvas 根 element中, 在两行 xmlns 申明下边, 加入一条属性,给其命名 x:Class. (这个属性来自 XAML xmlns,这就是为什么前面总有个x: 前缀.)

    要给 x:Class赋值, 你必须提供两个值: class的名称 (通常与namespace是相关的) 和相应的类的程序集的 Uniform Resource Identifier (URI). 这个例子使用了 SampleApplication.EventHandlingCanvas来命名namespace和class, 并为assembly 命名为 SampleApplication.dll. 这里面的申明格式为 x:Class 属性值是namespace.class;assembly=assemblyUri. 因此, 此例子中,你应该将x:Class 属性值设置如下:
    x:Class="clr-namespace:SampleApplication.EventHandlingCanvas;assembly=SilverlightEventHandling.dll" .
    注意
    文件扩展名 (一般是 .dll) 是必须的,因为 assembly= 值已经不仅仅作为一个程序集名称了,它还会作为一个 URI来对待.

    选择一个事件来处理. 在此例子中, 添加一个子Canvas element 到根canvas下, 并对新添加的Canvas对象的MouseLeftButtonUp 事件进行处理 . 粘贴下面的XAML代码到根Canvas 标记中.

    CS
    <Canvas Width="100" Height="30" Background="Gray" MouseLeftButtonUp="OnClick"> <TextBlock>Click me</TextBlock> </Canvas>

     

    VB

    <Canvas x:Name="Button1" Width="100" Height="30" Background="Gray" MouseLeftButtonUp="OnClick"> <TextBlock>Click Me</TextBlock> </Canvas>
    编写一个Handler
    所有XAML页中的事件处理程序必须在x:Class中申明的class和assembly文件中进行编写.

    在托管代码文件中定义事件处理程序
    打开你的Page1.xaml.cs或 你的 Page1.xaml.vb 文件进行编辑.

    对于 C#, 该文件已经定义好了命名空间和类.对于Visual Basic, 类已经定义好了, 而命名空间则由该project的默认命名空间来指定. (另外要提的一点是,该文件中会有一个 Loaded handler; 尽管在下面的示例中并没有出现,但你也不要在你的文件中删除这个.)

    如果你的后台代码 文件是由模板生成的, 你可能会想要更改namespace/class 名称并对 x:Class到 namespace/class的映射进行特定的修改. 下面的这个示例, 在你的Page1.xaml.cs中的代码 文件如果是这个样子(using 等申明已经省略).
    namespace SampleApplication { public partial class EventHandlingCanvas : Canvas { public EventHandlingCanvas(){} } }
    对于VB, Page1.xaml.vb 内容类似下面.

    Partial Public Class Page1 Inherits Canvas End Class
    定义这个handler 方法,并始其为 EventHandlingCanvas 类的成员. 这个 handler 需要使用 sender 参数来包括对添加自己的element的引用, 然后设置一个与原始的在XAML中定义的某个属性不同的值(这儿使用了 SolidColorBrush 来代替在XAML中定义的某个属性). 一般的,对于handlers ,我们一般设置为私有.

    CS
    void OnClick(object sender, MouseEventArgs e) { Canvas cc = sender as Canvas; SolidColorBrush sb = new SolidColorBrush(); sb.Color = Colors.Red; cc.Background = sb; TextBlock tb = cc.Children[0] as TextBlock; tb.Text = "Clicked..."; }

     

    VB

    Private Sub OnClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Dim redBrush As New SolidColorBrush redBrush.Color = Colors.Red Me.Button1.Background = redBrush Dim tb As TextBlock = Me.Button1.Children(0) tb.Text = "Clicked..." End Sub

     

    编译这个程序. 当然你载入这个HTML页,再在浏览器点击 Click me按钮,你应该能看到它的颜色改变了.

    注意
    托管代码 事件中一般使用 EventHandler,除非有特殊的事件数据激发某个不同的handler 并且要求有一个从 EventArgs派生的类. MouseLeftButtonDown 事件有鼠标特有的事件数据, 所以它使用 MouseEventHandler 代理.

    在C#中关联 Event Handlers

    一般的, 直接在XAML中申明关联事件handlers是一种简便的方法.但是你也可以使用common language runtime (CLR)来添加事件handlers. 比如, 对于 C# 语言,你 使用+=添加handlers 到事件 . 接下来的过程使用类的构造函数来添加Loaded event handler. 这个 Loaded event handler然后关联 OnClick handler 到 MouseLeftButtonUp 事件.

    更改 XAML 文件和 托管 代码文件
    编辑 Page1.xaml. 在开始的Canvas 的"button"后, 添加别一个相似的button,但是确保它在XAML中没有申明 event handler.

    CS

    <Canvas x:Name="Button2" Canvas.Top="50" Width="100" Height="30" Background="Gray"> <TextBlock>Click me too</TextBlock> </Canvas>

     

    VB

    <Canvas x:Name="Button2" Canvas.Top="50" Width="100" Height="30" Background="Gray"> <TextBlock>Click Me Too</TextBlock> </Canvas>


     

    编辑 Page1.xaml.cs. 在 EventHandlingCanvas 类的默认为空的构造函数中, 关联一个handle给 Loaded 事件. (你将在接下来的步骤中定义 handler的内容.)

         CS

    public EventHandlingCanvas() { this.Loaded+=new EventHandler(EventHandlingCanvas_Loaded); }

     

    定义 EventHandlingCanvas_Loaded handler, 它是你的Button2的引用.

    CS

    void EventHandlingCanvas_Loaded(object sender, EventArgs e) { Button2.MouseLeftButtonUp+=new MouseEventHandler(OnClick); }

    保存这些文件并编译程序. 当你在浏览器中载入 HTML 页然后单击第二个Click me 时, 你可以看到它的颜色也改变了.

    在Visual Basic关联 Event Handlers(暂不译)
    Visual Basic has a different syntax for attaching handlers that relies on the keywords With事件 and Handles. In the case of named elements that are created in XAML, you will not directly see the With事件 keywords applied. In a Silverlight Visual Studio project, With事件 keywords are added and field references (for accessing your named XAML elements in code) are created through generated code by default. (Remember the prewired Loaded handler in the code 文件s that was mentioned earlier? That prewired Loaded handler and the partial class definition are both necessary so that the code generation can work.) Handles syntax will work only if you give the source element a unique x:Name; that name becomes your instance reference when you declare Handles.

    To change the XAML and the 托管 code
    Edit Page1.xaml. After the first Canvas "button", insert another similar button that does not have a XAML event handler in it.

    CS

    <Canvas x:Name="Button2" Canvas.Top="50" Width="100" Height="30" Background="Gray">
    <TextBlock>Click me too</TextBlock>
    </Canvas>

    VB

    <Canvas x:Name="Button2" Canvas.Top="50" Width="100" Height="30" Background="Gray"> <TextBlock>Click Me Too</TextBlock> </Canvas>


    Edit Page1.xaml.vb. Add another handler that does essentially the same thing as the first one. This time, use Handles to assign the handler to the specific MouseLeftButtonUp event on the Button2 instance.

    VB

    Private Sub Button2_MouseLeftButtonUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Button2.MouseLeftButtonUp Dim redBrush As New SolidColorBrush redBrush.Color = Colors.Red Me.Button2.Background = redBrush Dim tb As TextBlock = Me.Button2.Children(0) tb.Text = "Clicked..." End Sub


    note
    If you give the first button the x:Name聽Button1, and the handler implementations are identical in signature as well as in function, you can designate more than one instance to be handled by the same handler, for example: 鈥?Handles Button1.MouseLeftButtonUp, Button2.MouseLeftButtonUp. If you do this, you will also want to remove the MouseLeftButtonUp event attribute from Button1, because now you are declaring the handling in code.

    原文地址

    2009年5月27日 6:30