快捷搜索:

[翻译] WPF:在XAML中嵌入DLR脚本(Python, Ruby) -第一部

媒介: 不停想将XAML和Python脚本结合起来,让WPF编程能够加倍类似于网页编程。原先想自己实现,但在Google了下,发明已经有不少实现规划,下面这篇文章中的办理规划已经斟酌的对照周全了,故翻译出来于大年夜家分享。

本人翻译的水平一样平常,大年夜家可以参考原文

建议涉猎全部系列:

第1部分 - Hosting the DLR

第2部分 - A Simple DLR Markup Extension

第3部分 - A DLR ValueConverter

第4部分 - A DLR Command

第5部分 - A DLR Event Handler

第6部分 - A Very Dynamic Application

着末一部分附带了一个Visual Studio 2008办理规划,包孕了本系列中的完备代码

下面是翻译内容:

XAML的框架容许我们轻松地在声明式和敕令式编程模型之间切换,如event handlers(事故处置惩罚法度榜样)等便是显着的例子,而其他如MarkupExtensions(标记扩展)和绑定所用的 ValueConverters(值转换器)就不那么显着了。当你实现一个自定义的MarkupExtension的ProvideValue措施时,你溘然进入了一个C#(或者是你选择的其他CLR说话)的敕令式天下。而XAML文档中阐明MarkupExtension生成是声明性的。

应用XamlParser类动态加载XAML 使得法度榜样员自由进出声明式和敕令式的天下,给他们供给了强大年夜的能力和机动性。然而,它彷佛...

动态加载XAML不像编译要领那样与敕令式天下结合在一路。例如,动态加载XAML时,你完全掉去了路由事故给事故处置惩罚法度榜样的能力。这极大年夜地阻碍了动态加载XAML中的用途。社区的态度是,假如你要处置惩罚事故,你应该简单地编译XAML 。在许多环境下,这就不是一个可以吸收的办理规划!

有一些绑定到CLR的解释型(动态)敕令式说话,如Python和Ruby。新的动态说话运行时(DLR)将鼓励了一些新的动态说话的成长,以及现有的动态说话与.Net的结合。在这6篇系列文章中我将演示若何在XAML中嵌入随意率性DLR说话。

首先是一些背景资料。XAML的动态特点(或欠缺动态特点)的话题曾在许多公开论坛多次评论争论。人们曾作出各类努力考试测验在XAML中嵌入 Python和其他动态说话(如下面的the Lambda Converter Extension),取得了不合程度的成功。以下是一些值得一读的文档链接:

Sam Ruby: No Dynamic XAML?

Chris Anderson: Yes Sam, it is dynamic...

John Gossman: Embedding Python into Xaml (attempt using Attached Properties)

M. Orçun Topdağı: WPFIX Part 1 (Lambda Converter Extension)

M. Orçun Topdağı: WPFIX Part 2 (Binding Extension)

M. Orçun Topdağı: WPFIX Part 3 (Extension Methods)

Marlon Grech: Embed code in XAML

Lloyd: The Last IValueConverter (也宣布在The Code Project )

加载DLR并不艰苦。DLR仍在成长,但从我对它的履历来讲是正面的。DLR 与其上的IronPython和IronRuby看来相称稳定,体现优越。

注:该系列的代码,针对的是IronPython 2.0 Beta 3响应的DLR。自那时起DLR的API有了一些重大年夜改动,以是这里列出的代码可能必要进行一些改动来运行在后续版本的DLR上。

DLR是包孕在两个法度榜样集中,Microsoft.Scripting.dll和Microsoft.Scripting.Core.dll。最简单的法子是尽快下载一个编译好的IronPython或IronRuby的版本,它们都从新宣布了DLR法度榜样集。

你的利用法度榜样应引用Microsoft.Scripting.dll和 Microsoft.Scripting.Core.dll,但并不必要引用Python或Ruby的法度榜样集,由于这些将会由DLR的需求而加载。为了避免在运行时定位DLL的问题,我建议将所有这些Dll放到你的利用法度榜样运行目录下以便能顺利启动。

以下是一个应用C#加载 DLR来谋略Python表达式的简单例子。履行后,结果应为11

using Microsoft.Scripting.Hosting;

using Microsoft.Scripting;

// create a ScriptRuntime instance

ScriptRuntime runtime = ScriptRuntime.Create();

// Get the engine for the target language

ScriptEngine eng = runtime.GetEngine("python");

// A scope is used to setup local variables - the context in

// which the script will be executed.

//

// We add:

// a = 5

// b = 6

ScriptScope scope = eng.CreateScope();

scope.SetVariable("a", 5);

scope.SetVariable("b", 6);

// Create a ScriptSource object from our script:

//

// a + b

ScriptSource source =

eng.CreateScriptSourceFromString(

"a + b", SourceCodeKind.Expression);

// evaluate the expression - result == 11.

object result = source.Execute(scope);

您可能还会对下面的文章感兴趣: