【问题标题】:Flexible loop through variables通过变量灵活循环
【发布时间】:2017-10-10 08:57:09
【问题描述】:

我在循环中使用 XAML 变量时遇到了困难,我的问题详述如下:

我有一个 foreach() 循环,我在 XAML 中有 4 个图像,比如说 image1, image2, image3, image4 现在我想将我在 foreach 循环中的路径与每个 image 变量相关联. 一个明显的解决方案是:

foreach() {
    //my stuff
    image1.Source = bitmapSource;
    image2.Source = bitmapSource;
    image3.Source = bitmapSource;
    image4.Source = bitmapSource;
}

但是这个解决方案并不灵活,我想过将我的image 变量放在一个数组中,但我认为这是不可能的(至少我还没有找到任何这样的方法)。 最好/最干净的方法是什么?谢谢

【问题讨论】:

  • 不喜欢它的人能否解释或给出至少一个解决方案,或一些提示?我们不都是资深开发者,我是学生,还在学习中..
  • 您应该在 ItemsControl 的 ItemTemplate 中拥有一组固定的图像控件,而不是一组。将 ItemsControl 的 ItemsSource 绑定到 ImageSource 对象或图像文件路径字符串的集合。参见例如this answerthis one.
  • @Clemens 哦,是的,我没有考虑过使用 ItemsControl,我会继续这样做。谢谢。
  • 我没有投反对票,但是您的问题缺少 XAML,并且没有特定的 UI 示例,我认为它是广泛的。 (或者它可能主要基于意见,因为您要求 “最好的方法是什么”
  • 我没有投反对票,但问题不是很好......我正在研究的几个问题:什么是 bitmapSource?您真的想将所有四个图像设置为相同的东西吗?你实际上在循环什么,你对从 foreach 获得的项目做了什么?

标签: c# wpf


【解决方案1】:

使用 LINQ 和 Enumerable.OfType<TResult> Method:

Grid1.Children.OfType<Image>().ToList().ForEach(c => c.Source = bitmapSource);

我假设图像位于名称为 Grid1Grid 容器内。如果它们在另一个容器中,请相应更改。

编辑: 如果您在上一条评论中指出您的图像位于不同的容器中,您可以这样做:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) 
    where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

然后:

FindVisualChildren<Image>(MainGrid).ToList().ForEach(c => c.Source = bitmapSource);

我再次假设您的不同容器位于名称为 MainGrid 的主 Grid 内。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2018-12-07
    • 2016-07-30
    相关资源
    最近更新 更多