GVKun编程网logo

silverlight和javascript交互

12

在本文中,我们将带你了解silverlight和javascript交互在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的.net–使用javascript激活silverlight事件、c

在本文中,我们将带你了解silverlight和javascript交互在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的.net – 使用javascript激活silverlight事件、c# – 我可以使用silverlight替换javascript和JQuery吗?、C#-Silverlight中的JavaScript表达式解析器、HttpClient能与silverlight交互么,如果不行,有什么技术可以模拟浏览器向silverlight交互

本文目录一览:

silverlight和javascript交互

silverlight和javascript交互

1.在silverlight调用javascript函数

   用System.Windows.brower命名空间下的某些silverlight类,你可以调用一段脚本写的javascript函数。这样就给你的silverlight代码一个很有规律的方式来和页面交互。

  比如:你在HTML页面中有下边一段javascript函数 

 function createText(message,user) {
            var el = document.getElementById("myElement");
            el.innerHTML = user+" "+message;
        }

   调用这个函数,首先用HtmlWindow.Getproperty()方法并把javascript的名字传进去来得到一个ScriptObjcet对象,然后在调用ScriptObjcet对象的InvokeSelf()方法。调用InvokeSelf方法时,可以把javascript函数的所有参数都传进去。

 ScriptObject scriptObjcet=(ScriptObject)HtmlPage.Window.GetProperty("createText");
 scriptObjcet.InvokeSelf("Jerry","Hello Wolrd");

 

效果

 

2.在javascript中调用silverlight方法

   在javascript中调用silverlight方法,主要有以下步骤:

    1.在silverlight程序中创建一个公开的方法来暴露你想在web页面中用的函数。

    2.在方法上边添加一个ScriptableMember属性。

    3.在包含这个方法的类上添加ScriptableType属性。

    4.调用HtmlPage.RegisterScriptableObject()将这个方法暴露给javascript。

 [ScriptableType()]
    public partial class InvokeMethod : UserControl
    {
        public InvokeMethod()
        {
            InitializeComponent();
            HtmlPage.RegisterScriptableObject("page",this);            
        }

        [ScriptableMember]
        public void ChangeText(string newText)
        {
            txbTest.Text="It's invoking by JavaScript "+newText;
        }
    }

  注册一个脚本化类型时需要指定一个名称并传递一个合适对象的引用,上边例子中InvokeMethod被注册时的名称为page.这样就告诉silverlight在web页面的silverlight控件中创建了另一个叫page的属性。想调用这个方法,javascript需要找到silverlight控件,获取到它的内容然后调用它的page.ChangeText()方法。

 function updateSilverlightText() {
            var ele = document.getElementById("myEle");
            ele.content.page.ChangeText("This text has been changed");
        }

 默认情况下,VS会自动添加一个测试页面,并给包含<object>元素的DIV一个名称,但是并没有给包含在里边的<object>对象名称。你需要自己添加一个名称以方便获取<object>对象,上边例子中的<object>对象名字为myEle。

调用javascript函数

 <p onclick="updateSilverlightText()" >Click here to change the text in silverlight</p>

效果

调用前   

         调用后 

 

3.浏览器中实例化silverlight对象

  和上边一样需要创建一个包含ScriptableMember方法的ScriptableType的类

 [ScriptableType]
    public class GetRandom
    {
        private Random rdm = new Random();
        [ScriptableMember]
        public int GetRandomNumber(int from,int end)
        {
           return  rdm.Next(from,end);
        }
    }

同样也需要将这个类注册一下,这次需要HtmlPage.RegisterCreateabletype()方法
HtmlPage.RegisterCreateableType("random",typeof(GetRandom));
创建一个注册类的实例,需要找到silverlight控件并调用它的ele.content.services.createObject()方法。这个例子中在javascript中调用此方法
 function getRandom() {
            var ele = document.getElementById("myEle");
            var r = ele.content.services.createObject("random");
            alert("Your number is " + r.GetRandomNumber(1,56));
        }
调用javascript
<input type="button" onclick="getRandom()" value="Click here to get number"/>
 
效果

.net – 使用javascript激活silverlight事件

.net – 使用javascript激活silverlight事件

我可以在页面中使用javascript来触发silverlight组件中的事件吗?如果是这样,有没有人有一些代码示例?

解决方法:

是的你可以.您需要使用“ScriptableMember”属性在.NET代码中的类上装饰方法,然后在对象上调用HtmlPage.RegisterScriptableObject以标记它与javascript的互操作性.您将创建一个名为OnMyEvent(sender As Object,e As MyEventArgs)的.NET方法,然后引发您想要的对象事件.然后你的javascript会调用它.

有关演练,请参阅此链接:
http://msdn.microsoft.com/en-us/library/cc221414(VS.95).aspx

c# – 我可以使用silverlight替换javascript和JQuery吗?

c# – 我可以使用silverlight替换javascript和JQuery吗?

我有一个大量使用JQuery的web应用程序.如果可能的话,我想开始使用silverlight.而不是使用jquery ajax功能和其他jquery功能,我想使用silverlight.这可能与silverlight有关吗?

解决方法:

不同的工具. jQuery最适合操作DOM. Silverlight(表面上)最适合富Internet应用程序,而不是操纵DOM.如果您的Web应用程序尝试使用JavaScript创建一个很酷的UI,那么Silverlight可能非常适合替换大量的JavaScript代码.

C#-Silverlight中的JavaScript表达式解析器

C#-Silverlight中的JavaScript表达式解析器

大家好!我有一个Silverlight项目,该项目需要帮助用户创建JavaScript逻辑表达式(例如“ var1!= var2&& var3> = var4”).很简单.问题是我没有太多时间自己创建一个人,因为调整过渡表会浪费一些时间.

因此,我在网上搜索一个,但是发现的只有几个类可以帮助您验证JavaScript,但是我需要一种加载,解析然后写回的方法.所以我想知道是否有人对我的做法有任何想法.我假设它不需要太多代码,也不必是C#示例.如果您能用C甚至伪代码给我一些想法,那将大有帮助.

谢谢,

弗拉基米尔

解决方法:

手动创建递归下降解析器.很有趣!

首先定义一个语法:

Expression -> SimpleExpression ExpressionTail
              (Expression)
SimpleExpression -> Atom Inequality Atom
ExpressionTail -> && Expression |
                  || Expression |
                  e
Atom -> Variable | Literal
Inequality -> == | != | > | >= | < | <=

(此语法不处理运算符的优先级,但是很容易编写一个可以满足此要求的语法.)

接下来,创建一个词法分析器,该词法分析器将读取输入字符串并创建标记,以便将字符串“ var1!= 4.0”转换为{Variable,!=,Literal}的列表.可以将它们一起砍掉,或者如果您想花哨的话,可以使用有限状态机来分析字符串.

现在创建一个递归下降解析器,将标记列表解析为一个表达式树.

public class Parser {

    public Parser() {
    }

    public Expression parse( LexicalAnalyzer lex) {
        lex.advance();
        return expression( lex);
    }

    private Expression expression( LexicalAnalyzer lex) {  

        switch( lex.current().type() ) {
            case Token.OpenParen:
                lex.advance();
                Expression expression = expression( lex);
                lex.eat( Token.CloseParen);
                return expression;
            case Token.Literal:
            case Token.Variable:
                return expressionTail( lex, simpleExpression(lex));
            default:
                throw new Exception( "ParseError: Expecting (, variable, or literal at character " + 
                                      lex.character());
        }
    }

    private SimpleExpression simpleExpression( LexicalAnalyzer lex) {

        Atom atom = atom( lex);
        switch( lex.current().type() ) {
            case Token.Equal:
                lex.advance();
                return new Equal( atom, atom(lex));
            case Token.NotEqual:
                lex.advance();
                return new NotEqual( atom, atom(lex));
            ...
            default:
                throw new Exception( "ParseError: Expecting ==, !=, <, <=, >, >= at" + 
                                     lex.character());
        }
     }

     private Expression expressionTail( LexicalAnalyzer lex, SimpleExpression expression) {

        switch( lex.current().type() ) {
            case Token.LogicalOr:
                lex.advance();
                return new OrExpression( expression, expression(lex) );
            case Token.LogicalAnd:
                lex.advance();
                return new AndExpression( expression, exptression(lex) );
            default:
                return expression;
        }
     }

     private Atom atom( LexicalAnalyzer lex) {
         switch( lex.current().type() ) {
             case Token.Literal:
                 Literal literal = new Literal( lex.current() );
                 lex.advance();
                 return literal;
             case Token.Variable:
                 Variable var = new Variable( lex.current() );
                 lex.advance();
                 return var;
             default:
                 throw new Exception("ParseError: ...");
          }
      }
}


public interface Expression {
    boolean evaluate( VariableValues values);
}

public interface SimpleExpression implements Expression {
}

public class Equal implements SimpleExpression {
    private final Atom left, right;
    public Equal( Atom left, Atom right) {
        this.left = left;
        this.right = right;
    }
    public boolean evaluate( VariableValues values) {
        return left.evaluate(values) == right.evaluate(values);
    }
}
public class NotEqual implements SimpleExpression {
    private final Atom left, right;
    public NotEqual( Atom left, Atom right) {
        this.left = left;
        this.right = right;
    }
    public boolean evaluate( VariableValues values) {
        return left.evaluate(values) != right.evaluate(values);
    }
}

public class OrExpression implements Expression {
    private final Expression left, right;

    public OrExpression( Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    public boolean evaluate( VariableValues values) {
        return left.evaluate(values) || right.evaluate(values);
    }
}
public class AndExpression implements Expression {
    private final Expression left, right;

    public AndExpression( Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    public boolean evaluate( VariableValues values) {
        return left.evaluate(values) && right.evaluate(values);
    }
}
public interface Atom {
    double evaluate( VariableValues values);
}
public class Literal implements Atom {
    private final double value;
    public Literal( double value) {
        this.value = value;
    }
    public double evaluate( VariableValues values) {
        return value;
    }
}
public class Variable implements Atom {
    private final String name;
    public Variable( String name) {
        this.name = name;
    }
    public double evaluate( VariableValues values) {
        return values.getValue( name);
    }
}

HttpClient能与silverlight交互么,如果不行,有什么技术可以模拟浏览器向silverlight交互

HttpClient能与silverlight交互么,如果不行,有什么技术可以模拟浏览器向silverlight交互

HttpClient能与silverlight交互么,如果不行,有什么技术可以模拟浏览器向silverlight交互

关于silverlight和javascript交互的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net – 使用javascript激活silverlight事件、c# – 我可以使用silverlight替换javascript和JQuery吗?、C#-Silverlight中的JavaScript表达式解析器、HttpClient能与silverlight交互么,如果不行,有什么技术可以模拟浏览器向silverlight交互等相关知识的信息别忘了在本站进行查找喔。

本文标签: