WPF/E CTP Quick Start - 第十部分:脚本和鼠标事件(翻译)

简介:
脚本与事件
  WPF/E能够让您在事件触发时执行JavaScript代码,例如一个对象被加载之后,或者鼠标进入了一个对象。这样的脚本被称之为“Event Handler”。
  为了定义一个“Event Handler”,您需要执行以下两步:
  • 在一个XAML文件里,添加下面的属性,使对象能够触发您的函数。
    someEvent="javaScript:myFunction"
    其中someEvent是您希望响应的事件名,而myFunction是您希望处理该事件的函数。
  • 在您的JavaScript文件中定义该函数。(关于建立一个JavaScript文件,请参照《WPF/E CTP Quick Start - 第一部分:创建一个WPF/E项目》。)
  让我们来尝试写一个示例。在WPF/E中,所有的 Canvas和形状元素都有一个事件叫做 MouseLefButtonDown,它会在用户鼠标在元素之上,并且左键被按下时被触发。让我们来为这个事件写一个Event Hander,调用JavaScript的alert函数来创建一个对话框。
<Canvas Height="300" Width="300"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="transparent"
MouseLeftButtonDown="javascript:helloworld">

<TextBlock Text="click me" FontSize="50"/>
</Canvas>
function helloworld() {
alert("hello world");
}
  您在声明一个Event Handler时不需要指定参数,但是如果您确实需要的话,您可以使用第一个参数“sender”作为触发事件的元素,而第二个参数“args”是一个包含了事件信息的对象。
 
设置属性
  您可以使用JavaScript来设置WPF/E对象的属性。当一个属性为一个字符串或一个数字时,您可以简单地使用JavaScirpt设置它。如果属性为一个WPF/E对象,但是它有个类型转换器,例如一个 SolidColorBrush,您可以用字符串形式来设置它。否则,您必须使用 createFromXaml方法来实例化一个新的属性值。
  下面的例子响应了 CanvasMouseLeftButtonDown事件。在这个Event Handler中,通过sender参数访问了 Canvas对象。在示例中将 CanvasBackground属性设为了红色,并且显示了它的 Height属性。
<Canvas Width="300" Height="300"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent"
MouseLeftButtonDown="javascript:changecolor">

<TextBlock Text="click me" FontSize="50"/>
</Canvas>
function changecolor(sender, args) {
sender.background = "red";

alert("Height is " + sender.Height);
}
 
设置附加属性
  如果要使用JavaScript设置一个附加属性,例如 Canvas.Top,您可以使用下面的语法:
  object[attachedPropertyName] = value;
  其中attachedPropertyName您想设置的附加属性的名称。
  下面的示例在左键被点击之后,将设置 TextBlockCanvas.Top属性设为了70。
<Canvas Width="300" Height="300"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent">

<TextBlock Text="click me" FontSize="50"
MouseLeftButtonDown="javascript:changelocation" />
</Canvas>
function changelocation(sender, args) {

sender["Canvas.Top"] = 70;
}
 
公有鼠标事件
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Ellipse x:Name="e1"
MouseMove="javascript:e1Move"
MouseEnter="javascript:e1Enter"
MouseLeave="javascript:e1Leave"
MouseLeftButtonDown="javascript:e1Down"
MouseLeftButtonUp="javascript:e1Up"
Height="100" Width="100"
Canvas.Left="80" Canvas.Top="30"
Stroke="Black" Fill="LightBlue"
StrokeThickness="10" />
</Canvas>
function e1Enter(sender, args) {
sender.stroke = "red";
}

function e1Leave(sender, args) {
sender.stroke = "black";
}

function e1Down(sender, args) {
sender.fill = "Green";
}

function e1Up(sender, args) {
sender.fill = "LightBlue";
}

function e1Move(sender, args) {
sender.fill = "yellow";
}
  另一个非常有用的事件是 Loaded事件。通常您会在根元素里声明响应该事件,但是 Loaded事件可以在任何 UIElement上响应。 Loaded事件提供了一个非常好的机会,可以让您在WPF/E控件显示的最后进行一些最后的改变。下面的例子响应了 Loaded事件,将 EllipseFill属性从 Blue改成 Red
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Ellipse Loaded="javascript:ellipse_loaded"
Height="200" Width="200" Canvas.Left="30" Canvas.Top="30"
Stroke="Black" StrokeThickness="10" Fill="LightBlue"/>
</Canvas>
function ellipse_loaded(sender, args) {
sender.Fill = "Red";
}
 
为对象命名并重新获取它们
  在之前的示例中,我们使用了JavaScript来修改发起事件的对象,但是如果您需要调用的方法或者修改的属性是属于其它对象的呢?WPF/E元素提供了一个方法叫做 findName,可以使您获得子元素。在使用 findName获得对象之前,您必须使用x:Name属性在申明XAML时为对象提供一个名字。
  下面的示例在鼠标点击 Canvas时修改了 EllipseFill属性。当 Canvas发起事件时,changeEllipseColor函数被调用,sender是 Canvas对象。该函数调用了sender.findName()函数获得了myEllipse对象,并且将它的 Fill属性设为了红色。
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent"
MouseLeftButtonDown="javascript:changeEllipseColor">

<TextBlock Text="click me" FontSize="50"/>
<Ellipse x:Name="myEllipse" Height="200" Width="200"
Canvas.Left="30" Canvas.Top="80"
Stroke="Black" StrokeThickness="10" Fill="LightBlue"/>
</Canvas>
function changeEllipseColor(sender, args) {
sender.findName("myEllipse").Fill = "red";
}
  当您编写的脚本代码并不是被WPF/E元素的事件触发时(例如一个普通的HTML事件),您就无法得到一个sender参数,用来使用 findName以获得一个WPF/E对象了。在这个情况下,您可以使用document.getElementById()来获得WPF/E的ActiveX控件,然后可以使用ActiveX控件的 findName方法。
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent"
MouseLeftButtonDown="javascript:changeEllipseColor2">

<TextBlock Text="click me" FontSize="50"/>
<Ellipse x:Name="myEllipse" Height="200" Width="200"
Canvas.Left="30" Canvas.Top="80"
Stroke="Black" StrokeThickness="10" Fill="LightBlue"/>
</Canvas>
function changeEllipseColor2(sender, args) {
var ag6 = document.getElementById("ag6");
ag6.findName("myEllipse").fill = "red";
}
  在之前的例子里,ag6是您在HTML页面中创建WPF/E的ActiveX控件时,传入new agHost()ID,例如在文档中“ 第一部分:创建一个WPF/E项目”描述的那样:
<script language="javascript">
// 创建一个WPF/E的ActiveX控件,这里的
// 方法使您的WPF/E的内容在这个ActiveX控件
// 被点击之前就创建完毕。
new agHost(
// 用于插入WPF/E ActiveX控件的元素,一般会使用
// DIV元素,如果您在上一步改变了HTML元素的ID,
// 您在这里也必须相应的改变。
"agControl1Host",
// WPF/E ActiveX控件的ID
"",
// 控件宽度
"300px",
// 控件高度
"300px",
// 控件的背景色
"#D6D6D6",
// 源元素(存放XAML内容的Script标签)
null,
// 存放WPF/E内容的XAML文件的URI
"myxaml.xaml",
// 是否是无窗的
"false",
// 最大帧率(Frame Rate)
"30",
// 处理错误的Handler,
// 您能够将其设为一个方法的引用。
null
);
</script>
  您可以在创建了ActiveX控件之后使用下面的代码,这使您能在以后不必再次获得ActiveX控件了。
// 方便起见,为WPF/E的ActiveX控件创建一个全局变量
// 它能让我们调用findName方法。
var ag6 = document.getElementById("ag6");
 
动态创建WPF/E对象
  您可以使用 createFromXaml方法使用JavaScript来创建一个新的WPF/E对象。下面的示例在 Canvas对象被鼠标左键被点击时,创建并添加了一个新的 Ellipse对象。
<Canvas Width="300" Height="300"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent"
MouseLeftButtonDown="javascript:createEllipse">

<TextBlock Text="click for circle" FontSize="40"/>
</Canvas>
function createEllipse(sender, args) {
var agControl = document.getElementById("ag7");
var e = agControl.createFromXaml(
'<Ellipse Height="200" Width="200" Fill="Blue"/>');
var canvas = sender;
canvas.children.Add(e);
}
  请注意,JavaScript需要您将字符串放在同一行中,除非您用+连接多个字符串。还要注意的是在这里XAML单引号和双引号的使用:使用单引号来表示JavaScript字符串,在XAML字符串中使用双引号。
 
交互地控制动画
  您可以使用Event Handler来控制 动画。将您希望控制的Storyboard给定一个名字,这样您就可以使用它的begin、stop、pause和resume方法来交互式地控制动画。
<Storyboard x:Name="animation"
Storyboard.TargetName="e1"
Storyboard.TargetProperty="(Canvas.Left)"
BeginTime="1">
<DoubleAnimation RepeatBehavior="Forever" To="300"/>
</Storyboard>
function animation_stop(sender, args) {
sender.findName("animation").stop();
}

function animation_pause(sender, args) {
sender.findName("animation").pause();
}

function animation_begin(sender, args) {
sender.findName("animation").begin();
}
 


本文转自 jeffz 51CTO博客,原文链接:http://blog.51cto.com/jeffz/60383,如需转载请自行联系原作者
相关文章
|
4月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
107 0
|
前端开发 C# Windows
WPF鼠标、键盘、拖拽事件、用行为封装事件
本文主要介绍了WPF中常用的鼠标事件、键盘事件以及注意事项,同时使用一个案例讲解了拓展事件。除此之外,本文还讲述如何用行为(Behavior)来封装事件。
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
|
C#
C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作   原文地址   C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的。
2251 0
|
Java C# 程序员
WPF程序中的弱事件模式
原文:WPF程序中的弱事件模式 在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不是按照我们所期望的方式工作。 例如,我想实现一个在窗口的标题栏中实时显示当前的时间,一个比较常规的做法如下:     var...
1151 0
|
C#
WPF 路由事件
原文:WPF 路由事件 最近想封装一个关于手势的控件,但是由其他的控件覆盖之后发现不能触发,据说是有一些事件在定义的时候就处理过e.Handle了。 定义的时候就处理了,就是为了控件能够正常的工作,别如Button.MouseDown什么的。
937 0
|
C#
WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探         最近因为项目需要,开始学习如何使用WPF开发桌面程序。
1564 0
|
C# 索引 容器
WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画
原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同时增加鼠标的悬停效果。
1839 0
|
C# Windows
WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
原文:WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法 一、WPF 中获取和设置鼠标位置   方法一:WPF方法   Point p = Mouse.GetPosition(e.
1053 0
|
.NET C#
深入浅出WPF——附加事件(Attached Event)
原文:深入浅出WPF——附加事件(Attached Event)   3.3 事件也附加——深入浅出附加事件                 WPF事件系统中还有一种事件被称为附加事件(Attached Event),简言之,它就是路由事件。
1255 0