Пройтись по Image в Grid.WPF

263
12 марта 2017, 04:13

привет есть код.хочу пройтись по элементам грида а именно по Image

foreach ( var item in mainGrid.Children)
{
    if (item.GetType() == Image) { }
}

питаюсь так но что не выходит как правилиьно

if (item.Equals(typeof(Image)))
{
}

вроде так норм но как теперь у Image убрать картинку которая задана как Source

то есть я думаю убрать источник так

oneImage.Source = null;

но как это в цикле организовать

Answer 1

Можете использовать класс VisualTreeHelper для работы с визуальным деревом.

Метод GetChild позволяет получить детей указанного элемента, ну а там уже делаете с детьми все, что пожелаете.

xaml:

<Grid x:Name="grid1">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Image Grid.Row="0" Source="image/1.png"/>
    <Image Grid.Row="1" Source="image/2.png" />
    <Button Grid.Row="3" Content="Clear Images" Click="Button_Click" />
</Grid>

code-behind:

private void Button_Click(object sender, RoutedEventArgs e)
{
    int childrenCount = VisualTreeHelper.GetChildrenCount(grid1);
    for (int i = 0; i < childrenCount; i++)
    {
        var current = VisualTreeHelper.GetChild(grid1, i);
        var image = current as Image;
        if (image != null)
        {
            image.Source = null;
        }
    }
}

Ну или просто:

foreach (var gridChild in grid1.Children)
{
    var image = gridChild as Image;
    if (image != null)
    {
        image.Source = null;
    }
}

Update

Чтобы получить прямо все-все Image, которые находятся в гриде, независимо от уровня вложенности, можно воспользоваться этим методом:

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 != null && child is T)
            {
                yield return (T)child;
            }
            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

Код нажатия на кнопку будет выглядеть следующим образом:

private void Button_Click(object sender, RoutedEventArgs e)
{
    foreach (Image image in FindVisualChildren<Image>(grid1))
    {
        image.Source = null;
    }
}

READ ALSO
Убрать звук обновления в .NET WebBrowser - C++

Убрать звук обновления в .NET WebBrowser - C++

Не могу перевсти данный код с C# в C++ или C++/CLI Цель в заголовке

306
Какой командой можно найти документ по имени ключа поля?

Какой командой можно найти документ по имени ключа поля?

Допустим есть запрос на обновление из учебника:

204
Ошибка &ldquo;Undefined property: Illuminate\Database\Eloquent\Builder&rdquo;

Ошибка “Undefined property: Illuminate\Database\Eloquent\Builder”

Пытаюсь сделать выборку по id в своем проекте по документации (стоит laravel 53)

369
Не работает cUrl с поддоменом

Не работает cUrl с поддоменом

Пытаюсь с основного домена (domainru) отправить cUrl запрос на поддомен (s1

262