上一篇文章初步测试了一下在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 =Background
def light(s, e):
s.Foreground = f1
def dark(s, e):
s.Foreground = f2
def click(s,e):
TextBox1.Text='你单击了我哦!'
Button1.MouseEnter += light
Button1.MouseLeave += dark
Button1.Click += click
";
我们给button添加了三个事件,单击,鼠标移入与移出事件,定义相就的处理函数,我们来看看是否可以达到我们期望的效果:
1:鼠标移入button控件,颜色改为黄色
2:鼠标移出button控件,颜色改为红色
3:鼠标单击以后,改变文本框的内容
这次我们试验了一下,让页面上的控件参与脚本运算,包括修改控件属性,给控件添加事件并定义事件处理程序,请关注下一篇文章