【问题标题】:How can I unattach an element from another element in the XAML tree?如何从 XAML 树中的另一个元素中取消附加元素?
【发布时间】:2010-03-20 15:26:24
【问题描述】:

在我的 Silverlight 应用程序中,我在应用程序 start 处加载我需要的所有 图像,并将它们存储在 字典 中。

然后,当我需要它们时,我从 字典 中挑选它们并将它们附加到 XAML 树等中。

但是,我遇到的问题是,如果我将图像对象附加到 Grid,然后想要再次使用该图像,它会告诉我:

图像元素已经是子元素 另一个元素。

如何遍历我的字典并“从父 XAML 元素中分离所有图像”?

【问题讨论】:

  • 您不应该使用带有 ImageSource 对象的 observablecollection 的视图模型,它绑定到 UI 中某种类型的 ItemsControl 吗?还是 Silverlight 没有那种基础架构?
  • 如果您在开始时解释为什么要在字典中构建具体图像可能会有所帮助?这是为了表演吗?避免异步图像加载?
  • @anthonywjones 我这样做是为了用户体验,例如在开始时加载 100 张图片并带有漂亮的动画等,然后进行非常快速的图片搜索/显示对于用户来说比每次需要访问新图片时都需要等待更好。
  • @will 这是可能的,但我体验到的动态越多(图像、样式、图像大小可以改变),在代码中执行它就越简单,例如tanguay.info/web/index.php?pg=codeExamples&id=365,但请记住 MVVM 方法,因为我了解其优势(单元测试能力等),但是您不必总是对 UI 等进行单元测试。

标签: wpf silverlight xaml


【解决方案1】:

控件不保存Image 的字典,而是保存ImageSource 的字典。 ImageSource 的单个实例可以分配给多个 Image 控件。

但是我怀疑,在有需求之前,自行创建 ImageSource 不会下载实际文件。如果是这种情况,您的初始化程序仍需要创建使用这些图像源的图像列表并等待所有人指示它们已加载。然后,您可以保留 ImageSource 的字典并丢弃实际的 Image 控件列表。

【讨论】:

  • 感谢您的建议,我现在所做的是我认为您的建议是:将 BitmapImages 本身直接放入字典中,然后让 Images 将其 ImageSource 分配给它想要的任何位图图像,次数它想要,工作正常,我没有上述尝试从可视树中取消附加元素的问题
【解决方案2】:
        Grid parentGrid = VisualTreeHelper.GetParent(image) as Grid;

        if (parentGrid != null)
            parentGrid.Children.Remove(image);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多