在昨天的文章里,我介绍了如何利用 PythonNet 来从 Python 中调用 WPF 类库。这只是第一步。接下来将面临的挑战是,如何有效的应付复杂多变的 UI 设计呢?XAML 语言是用来解决这个问题的,它将界面设计与编程逻辑分割开来。但是 XAML 在 Visual Studio 中是通过很多工具来自动产生连接代码的。对于我们的纯手工打造的 Python 程序,如何能利用好 XAML 工具呢?
其实,WPF 类库的 Markup 名字空间下提供的 XamlReader 类就提供了动态加载 XAML 语言的功能。但关键是,用 XamlReader 语言加载的 XAML 语言中不能含有事件属性,你不能简单地在 Button 标签中添加 Click=”xxx” 属性。
这个问题的解决,其实是要求有一个良好的程序结构。在用 Visual Studio 生成的 C# 工程中,WPF 向导为我们自动配置好了这些,比如界面设计的 xxx.xaml 文件,界面的事件响应程序文件(也叫隐藏文件)xxx.xaml.cs ,以及自动生成的 xxx.g.cs 文件和 baml 文件。编译过程中,首先将 xaml 文件编译成 baml 文件,也就是二进制的格式,减少空间占有,然后将其打包进程序的资源里,在自动生成的 xxx.g.cs 文件中,程序从打包的资源里加载 baml ,然后安装事件响应程序。
所有这些自动的过程,在用 Python 编写的时候,只能改由我们手工打造了。