上一篇文章初步测试了一下在silverlight下面IronPython的简单调用,以直接执行语句的方式进行脚本执行。
下面我们看看脚本文件如何与页面上的控件进行交互
xaml代码:
<Grid x:Name="LayoutRoot" Background="White"> <Grid.ColumnDefinitions> <ColumnDefinition Width="300"></ColumnDefinition> <ColumnDefinition Width="150"></ColumnDefinition> <ColumnDefinition Width="150"></ColumnDefinition> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> </Grid.RowDefinitions> <TextBox TextWrapping="Wrap" Name="txtScript" Grid.Column="0" Grid.RowSpan="5"> </TextBox> <TextBox Grid.Row="0" Grid.ColumnSpan="2" Grid.Column="1" Text="脚本控件以下控件"></TextBox> <TextBox Grid.Row="1" Grid.Column="1" Text="按钮"></TextBox> <Button Name="btn" Grid.Row="1" Grid.Column="2" Content="click me!"></Button> <TextBox Grid.Row="2" Grid.Column="1" Text="文本框"></TextBox> <TextBox Name="txt" Grid.Row="2" Grid.Column="2" Text="hell python!"></TextBox> <Button Grid.Row="5" Grid.ColumnSpan="3" Content="run" Click="Button_Click"></Button> </Grid>
.cs代码
ScriptEngine _engine; ScriptScope _scope; public MainPage() { InitializeComponent(); this._engine = Python.CreateEngine(); this._scope = this._engine.CreateScope();
this.Registor(this.btn, "Button1");//把xaml中定义的button注册到脚本文件中 this.Registor(this.txt, "TextBox1");//把xaml定义的textbox注册到脚本文件中 SolidColorBrush tt = new SolidColorBrush(Colors.Red);/ this.Registor(tt, "Background"); //tt为提前实例化的对象,并注册到脚本文件中 }
public void Registor(object obj, string name) { this._scope.SetVariable(name, obj); } public void UnRegister(string name) { this._scope.RemoveVariable(name); }
//单击按钮后执行脚本
private void Button_Click(object sender, RoutedEventArgs e) {
var temp = @"Button1.Content='sssss'TextBox1.Text='dsfadfaa'TextBox1.Background =Background
TextBox1.Text='你单击了我哦!'"; Exec(temp); }
public void Exec(string script) { _engine.CreateScriptSourceFromString(script, SourceCodeKind.Statements).Execute(_scope); }
我们看看脚本都做了什么事情,运行脚本以后,我们首先把button的文件改为'sssss',同时修改了文本框的背景色
如图:
简单的交互有了,我们稍微修改一下,如何能给控件加上事件是否就更好了?我们就来测试一下
修改脚本文件:
this.Registor(tt1, "f1"); this.Registor(tt2, "f2");
var temp = @"Button1.Content='sssss'TextBox1.Text='dsfadfaa'TextBox1.Background =Backgrounddef light(s, e): s.Foreground = f1
def dark(s, e): s.Foreground = f2def click(s,e): TextBox1.Text='你单击了我哦!'Button1.MouseEnter += lightButton1.MouseLeave += darkButton1.Click += click";
我们给button添加了三个事件,单击,鼠标移入与移出事件,定义相就的处理函数,我们来看看是否可以达到我们期望的效果:
1:鼠标移入button控件,颜色改为黄色
2:鼠标移出button控件,颜色改为红色
3:鼠标单击以后,改变文本框的内容
这次我们试验了一下,让页面上的控件参与脚本运算,包括修改控件属性,给控件添加事件并定义事件处理程序,请关注下一篇文章
转载于:https://www.cnblogs.com/wangxh/archive/2010/10/24/1859753.html