Tales from the Smart Client

John Gossman's observations on Avalon development

Attached Properties and Python script

While I'm trying to work around the xml:space issue from my last post, it is worthwhile to see how simple it was to create the attached property (which works fine, as long as your script doesn't need newlines...):

namespace Pythalon

{

     using System;

     using System.Globalization;

     using System.Windows;

     using System.Windows.Media;

     using IronPython;

     using IronPython.Hosting;

 

     public class PythonScript

     {

          #region DependencyProperty Declarations

          private static PropertyMetadata ScriptPropertyMetadata = new PropertyMetadata(new SetValueOverride(PythonScript.SetScriptValueOverride));

          public static DependencyProperty ScriptProperty = DependencyProperty.RegisterAttached("Script", typeof(string), typeof(PythonScript), ScriptPropertyMetadata);

          #endregion DependencyProperty Declarations

 

 

          private string script;

          private PythonEngine pythonEngine = new PythonEngine();

          private FrameworkElement target;

 

          public PythonScript(FrameworkElement target, string script)

          {

              this.target = target;

              this.script = script;

 

 

              this.InitializeModuleEnvironment();

              if (target.IsLoaded)

              {

                   this.Execute();

              }

              else

              {

                   this.target.Loaded += new RoutedEventHandler(target_Loaded);

              }

          }

 

          private void InitializeModuleEnvironment()

          {

              this.pythonEngine.ExecuteFile("Startup.py");

              this.pythonEngine.SetVariable("Target", this.target);

              foreach (Visual v in VisualOperations.GetChildren(this.target))

              {

                   string name = (string)v.GetValue(FrameworkElement.NameProperty);

                   if (!String.IsNullOrEmpty(name))

                   {

                        this.pythonEngine.SetVariable(name, v);

                   }

              }

          }

 

          void target_Loaded(object sender, RoutedEventArgs e)

          {

              this.Execute();

          }

 

          public void Execute()

          {

              this.pythonEngine.Execute(this.script);

          }

 

          public override string ToString()

          {

              return this.script;

          }

         

          #region DependencyProperty Infrastructure

          public static void SetScriptValueOverride(DependencyObject o, object value)

          {

              string script = value as string;

              FrameworkElement target = o as FrameworkElement;

              if ((target != null) && (script != null))

              {

                   PythonScript pyScript = new PythonScript(target, script);

              }

          }

 

          public static string GetScript(DependencyObject d)

          {

              return (string)d.GetValue(PythonScript.ScriptProperty);

          }

 

          public static void SetScript(DependencyObject d, string value)

          {

              d.SetValue(PythonScript.ScriptProperty, value);

          }

          #endregion DependencyProperty Infrastructure

     }

}

 

Published Friday, May 13, 2005 10:36 PM by JohnGossman

Comments

No Comments
New Comments to this post are disabled

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker