Silverlight下面的IronPyton(2)

上一篇文章初步测试了一下在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:鼠标单击以后,改变文本框的内容

              

 

这次我们试验了一下,让页面上的控件参与脚本运算,包括修改控件属性,给控件添加事件并定义事件处理程序,请关注下一篇文章

 

 

  

 

 

 

posted @ 2010-10-24 15:27  wangxh  阅读(732)  评论(0编辑  收藏  举报