来自Xaml文件的Javascript数组TextBlock元素

时间:2011-05-08 15:27:22

标签: javascript silverlight xaml

工作的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);
}

但'发送者'没有这样的方法(并且IntelliSense对我没有帮助)。

这是xaml文件:

http://pastebin.com/BR8bCJxh

onLoaded事件正确触发,fillDataArray函数也成功结束(使用警告(textBlockArray.length)在其他地方测试)

感谢。

超短摘要:

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

3 个答案:

答案 0 :(得分:2)

如果你真的必须坚持使用Javascript API(我确定你有充分的理由不使用Managed API)那么我建议你花一点时间来审查documentation

你无法操纵Xaml,好像它有一些如何成为你的html文档DOM的一部分。该插件自己处理构造的Silverlight UI元素集。

Javascript API使我们无法选择特定类型的元素的简单集合。事实上,它无法简单地拥有所有元素的扁平集合。我们可以创建一个javascript函数来递归执行这样的枚举,因为只包含其他元素的两个元素是PanelBorder

另一个问题是它没有提供确定元素类型的好方法。因此,我们如何确定元素是BorderPanel还是TextBlock并不明显。然而,我们可以通过测试我们期望在该类型上存在的属性来推断类型来处理这个问题(例如,我们期望在`Panel上有Children属性。

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

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);
    }
}

现在我们可以在Grid的Loaded事件中使用它。我只是将字符串“XX”添加到所有文本块的末尾: -

var hasLoaded = false;
function OnLoaded(sender, eventArgs)
{
    if (hasLoaded == true)
        return;

    forEachDescendant(sender, function (elem)
    {
        if (typeof elem.Text == 'string')
        {
            elem.Text += 'XX';
        }
    });

    hasLoaded = true;
}

hasLoaded不会保护代码不会执行多次。有时您可以更频繁地获得加载的事件。

答案 1 :(得分:0)

JavaScript无权访问您的XAML,无法从JavaScript操纵.NET对象。

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

如果它有帮助,XAML确实可以访问HTML模型,所以你可以从你的XAML调用一个JavaScript函数,但这也有点棘手,而且比真正的解决方案更糟糕,除了我'我不确定这是否能解决你的问题。

答案 2 :(得分:0)

我不确定这个Grid对象是什么,但尝试这样的事情:

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

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