【问题标题】:Strange silverlight event behaviour奇怪的 Silverlight 事件行为
【发布时间】:2011-03-14 09:08:59
【问题描述】:

我是 silverlight 和 .net 的菜鸟。刚开始和他们一起玩,我有一个事件附加到一个行为奇怪的自定义控件。这将是处理程序代码:

private void clickCloseWindow(object sender, RoutedEventArgs e)
    {
        StackPanel ctrl = (StackPanel)FindName("WindowsPanel");

        var s = from r in ctrl.Children.OfType<BarWindowTab>() where r.Id==Id select r;

        foreach (BarWindowTab b in s)
        {
            ctrl.Children.Remove(b);
        }

        parent.Children.Remove(this);
    }

如您所见,我正在尝试从屏幕上删除几个对象。问题是,处理程序在每次删除后出于某种原因退出,而不是一次全部删除。当我第一次按下按钮时,它会删除 stackpanel 子项,然后退出,我必须再次按下它才能删除另一个对象。有人解释一下为什么吗?

【问题讨论】:

    标签: c# silverlight silverlight-4.0


    【解决方案1】:

    s 是否真的包含对象列表?

    您正在选择 r.Id == Id 所在的项目,但不知道 Id 是什么以及它来自哪里,看起来您的代码应该只返回一个项目。

    【讨论】:

    • +1... 将语句更改为var s = ctrl.Children.OfType&lt;BarWindowTab&gt;(); 应该可以解决他的单选问题。
    • 是的,s 应该有一个项目。我正在模拟 Windows 桌面。我为“窗口”制作了一个自定义控件,并且我在栏中的每个窗口都有标签,就像 Windows 桌面分组在堆栈面板中一样,所以当我关闭窗口时,我也想删除标签。选项卡和窗口通过其 Id 属性“链接”。
    【解决方案2】:

    一旦您摆脱了只选择一个具有匹配 ID 的项目的事实,您可能会遇到另一个问题。我想如果你附加一个调试器并捕获异常,你会发现一个会被抛出:)

    您在迭代集合 ctrl.Children 时对其进行了修改,这破坏了整个枚举模式。 (删除一项 -> 尝试移至下一项 -> “哦裤子,收藏已更改”)

    Linq 查询生成您可以想象的修饰枚举器,指向原始集合。通过调用 ToList 或 ToArray 将 s 强制为单独的集合将解决此问题。

    【讨论】:

    • 泰。就像你说的那样。如果我在从堆栈面板中删除项目后立即添加中断,问题也得到了解决,所以当我让它继续时它一定触发了异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2020-03-03
    • 2020-11-14
    • 2012-11-09
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多