Xaml文件中TextBlock元素的Javascript数组

Xaml文件中TextBlock元素的Javascript数组,javascript,silverlight,xaml,Javascript,Silverlight,Xaml,一个工作的xaml文件(Silverlight)有很多TextBlock元素。我需要这些用于数据处理,所以我想将它们放在一个全局数组中: var textBlockArray = []; function fillDataArray() { textBlockArray = document.getElementsByTagName("TextBlock"); } function OnLoaded() { alert('In Vowels'); fillDataAr

一个工作的xaml文件(Silverlight)有很多TextBlock元素。我需要这些用于数据处理,所以我想将它们放在一个全局数组中:

var textBlockArray = [];

function fillDataArray() {
    textBlockArray = document.getElementsByTagName("TextBlock");
}

function OnLoaded() {
    alert('In Vowels');
    fillDataArray();
}
但是textBlockArray.length为0。有人知道为什么吗?我认为它与“document.getElementsByTagName”(这是html元素,不是silverlight元素?)有关,所以我认为我需要这样做:

var textBlockArray = [];

function fillDataArray(sender) {
    textBlockArray = sender.getElementsByTagName("TextBlock");
}

function OnLoaded(sender) {
    alert('In Vowels');
    fillDataArray(sender);
}
function fillDataArray(sender) {
    var textBlockArray = new Array(),i = 0,obj;
    while (sender[i]) {
        obj = sender[i];
        if (typeof obj=="TextBlock")
            textBlockArray.push(obj);
        i++;
    }
}
但是“发送者”没有这样的方法(而且IntelliSense对我帮助不大)

这是xaml文件:

onLoaded事件正确激发,fillDataArray函数也成功结束(使用其他地方的警报(textBlockArray.length)对此进行了测试)

谢谢

超短摘要:


因此,基本上,我要做的就是从我的Xaml页面获取所有元素,并将它们放入onLoad函数的数组中。

JavaScript无法访问您的Xaml,无法从JavaScript操作您的.NET对象

这可以通过HTML实现,因为JavaScript可以访问页面的HTMLDOM,但XAML对象模型并非如此,它们完全没有连接,运行在完全不同的上下文中


如果有帮助的话,XAML确实可以访问HTML模型,例如,您可以从XAML调用JavaScript函数,但这也有点棘手,与其说是一个真正的解决方案,不如说是一个黑客,而且我不确定这是否能解决您的问题

我不确定这个网格对象是关于什么的,但请尝试以下方法:

var textBlockArray = [];

function fillDataArray(sender) {
    textBlockArray = sender.getElementsByTagName("TextBlock");
}

function OnLoaded(sender) {
    alert('In Vowels');
    fillDataArray(sender);
}
function fillDataArray(sender) {
    var textBlockArray = new Array(),i = 0,obj;
    while (sender[i]) {
        obj = sender[i];
        if (typeof obj=="TextBlock")
            textBlockArray.push(obj);
        i++;
    }
}

向我展示这个对象的结构(比如打印),我可以改进代码

,如果你真的必须坚持使用Javascript API(我相信你有很好的理由不使用托管API),那么我建议你花一点时间回顾一下

您不能操纵Xaml,就好像它已经成为html文档DOM的一部分一样。插件本身处理构造的Silverlight UI元素集

javascriptapi无法为我们提供选择特定类型元素的简单集合的方法。事实上,它不能简单地将所有元素都收集起来。我们可以创建一个javascript函数来递归地执行这样的枚举,因为只有两个元素将包含其他元素,即
面板
边框

另一个问题是API it也没有提供确定元素类型的好方法。因此,如何确定元素是
边框
、面板还是
文本块
并不明显。但是,我们可以通过测试该类型上所期望的属性(例如,“Panel”上所期望的
子属性)的存在来推断该类型来处理此问题

我们可以从元素枚举器开始:-

function forEachDescendant(elem, callBack)
{
    if (typeof elem.children == 'object')
    {
        for (var i = 0; i < elem.children.count; i++)
        {
            var child = elem.children.getItem(i);
            callBack(child);
            forEachDescendant(child, callBack);
        }
    }
    else if (typeof elem.child == 'object')
    {
        callBack(elem.child);
        forEachDescendant(elem.child, callBack);
    }
}

您不必担心
hasload
保护代码不会执行多次。有时,加载事件的频率比预期的要高。

显示调用onload的代码。请参阅pastebin链接,行号3是,但您使用什么来加载?什么是发送者?是XAML字符串?调试器告诉我发送方是根网格对象。@Matthias:我相信这个问题与Silverlight 1有关,所以我添加了Silverlight-1.0标记。请将此标签添加到您今后提出的所有问题中,以强调您正在使用(并坚持使用)Silverlight 1。否则,回答者(如juandg)会认为您使用的是更高版本的Silverlight,因此提供的答案可能对您没有什么好处。我很抱歉,但这是不正确的。我的已加载事件正确激发。。我还有另外两个Silverlight页面,它们后面都有完美的Javascript。我只是在这个问题上遇到了一些问题。通过回答OP的另一个问题,我怀疑他使用的是Silverlight 1.0,那里可能有JavaScript访问。我不确定这应该做什么,但我的textBlockArray的长度仍然是0。(顺便说一句,结果数组也有…)在调试器上显示网格对象(打印),使用扩展节点如何执行?我不习惯使用Javascript。(顺便说一下,我正在使用VisualStudio2010。)您在调试器中没有看到它吗?只需打开节点并进行打印屏幕,然后显示图片。如果不使用Visual Studio进行调试,我的断点不会因为某种原因而被命中。我可以在Chrome中进行基本调试,但当我在那里设置断点时,我的Silverlight插件崩溃了:pThanks。这是一个非常有帮助和明确的解释。代码似乎也在工作。