Derek Kennard Ответов: 2

WPF C# циклический просмотр элемента управления Tab в поисках текстовых полей


Здравствуйте, у меня проблема. Мне нужно вернуть данные из SQL в окно, чтобы заполнить текстовые поля. Если текстовое поле пусто post return, то поверните цвет фона == красный.

Я заставил его работать, используя приведенный ниже код:

private void PlayingWithColors()
{
    foreach (var tb in FindVisualChildren<TextBox>(this).Where(tb => tb.Text == String.Empty))
    {
        tb.Background = Brushes.Red;
    }
}

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

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


Проблема заключается в конечных пользователях. Теперь они хотят иметь меньшее окно и вкладки. Поэтому, как только я добавил tabcontrol, я потерял функциональность. Что я делаю не так или что я могу сделать по-другому, чтобы прочитать вкладки для всех текстовых полей?

Пример XAML:

<TabItem Header="Vitals">
                <GroupBox Header="Vital Signs" FontWeight="Bold" BorderBrush="Black" BorderThickness="1"
                          Margin="10">
                    <StackPanel Margin="10" HorizontalAlignment="Left" Width="782">
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="171"
                                   Margin="1,1,1,0"
                                   UseLayoutRounding="True" Height="30">
                            <Label Content="HR:                " FontWeight="Normal"
                                   HorizontalAlignment="Left" VerticalContentAlignment="Center"
                                   Height="27" />
                            <TextBox x:Name="TbHr" TextWrapping="Wrap" Text="" HorizontalAlignment="Center"
                                     Width="75" VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Left" Height="27" />
                        </TextBlock>
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="171"
                                   Margin="1,1,1,0"
                                   UseLayoutRounding="True" Height="30">
                            <Label Content="RR:                 " FontWeight="Normal"
                                   HorizontalAlignment="Left" VerticalContentAlignment="Center"
                                   Height="27" />
                            <TextBox x:Name="TbRr" TextWrapping="Wrap" Text="" HorizontalAlignment="Center"
                                     Width="75" VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Left" Height="27" />
                        </TextBlock>
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="171"
                                   Margin="1,1,1,0"
                                   UseLayoutRounding="True" Height="30">
                            <Label Content="BP:                 " FontWeight="Normal"
                                   HorizontalAlignment="Left" VerticalContentAlignment="Center"
                                   Height="27" />
                            <TextBox x:Name="TbBp" TextWrapping="Wrap" Text="" HorizontalAlignment="Center"
                                     Width="75" VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Left" Height="27" />
                        </TextBlock>
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="171"
                                   Margin="1,1,1,0"
                                   UseLayoutRounding="True" Height="30">
                            <Label Content="Weight:          " FontWeight="Normal"
                                   HorizontalAlignment="Left" VerticalContentAlignment="Center"
                                   Height="27" />
                            <TextBox x:Name="TbWgt" TextWrapping="Wrap" Text=""
                                     HorizontalAlignment="Center"
                                     Width="75" VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Left" Height="27" />
                        </TextBlock>
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="171"
                                   Margin="1,1,1,0"
                                   UseLayoutRounding="True" Height="30">
                            <Label Content="Weight Type: " FontWeight="Normal"
                                   HorizontalAlignment="Left" VerticalContentAlignment="Center"
                                   Height="27" ToolTip="lb or kg" />
                            <TextBox x:Name="TbWgtType" TextWrapping="Wrap" Text=""
                                     HorizontalAlignment="Center"
                                     Width="75" VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Left" Height="27" />
                        </TextBlock>
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Width="181"
                                   Margin="1,1,1,0"
                                   UseLayoutRounding="True" Height="30">
                            <Label Content="Vital Date:      " FontWeight="Normal"
                                   HorizontalAlignment="Left" VerticalContentAlignment="Center"
                                   Height="27" ToolTip="lb or kg" />
                            <TextBox x:Name="TbVitalDate" TextWrapping="Wrap" Text=""
                                     HorizontalAlignment="Center"
                                     Width="87" VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Left" Height="27" />
                        </TextBlock>
                    </StackPanel>
                </GroupBox>
            </TabItem>

2 Ответов

Рейтинг:
13

Mahindra Shambharkar

Проблема заключается в итерации по визуальному дереву, чтобы найти элемент управления. Если вы отлаживаете свое приложение, вы можете увидеть, что элемент управления TextBox, который присутствует в другом tabitem, чем текущий, не виден и, следовательно, не отображается в визуальном дереве.

Просто замените метод FindVisualChildren на

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject obj) where T : DependencyObject
       {
           if (obj != null)
           {
               if (obj is T)
                   yield return obj as T;

               foreach (DependencyObject child in LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>())
                   foreach (T c in FindVisualChildren<T>(child))
                       yield return c;
           }
       }



Надеюсь, это решит вашу проблему.


Derek Kennard

Человек, у меня есть настолько больше, чтобы учиться. Спасибо за информацию. Я работал как чемпион!

Mahindra Shambharkar

Слава богу, это сработало, я все еще учусь WPF :)

Member 14046590

Самый лучший (и самый компактный) ответ, который я нашел по этому вопросу. Отлично работает с TabControl

Рейтинг:
0

Member 2796559

Основываясь на приведенном выше решении, я изменил код, чтобы вы могли вставлять его в окно WPF с элементами управления tab или другими контейнерами, и он будет циклически проходить через все элементы управления textbox. Элементы управления TB добавляются в список визуальных элементов, и с возвращенным списком вы можете делать все, что вам нравится.

Удалите предложение where, чтобы удалить ограничение только для пустых текстовых полей. Не забудьте закрыть скобку после (родитель) )

Удалить ==&ГТ; .Где(ТБ =&ГТ; ТБ.текстовая строка.Пустой))

<pre>public class cEnumControls
    {
        public static List<Visual> EnumVisual(UIElement Parent, List<Visual> collection)
        {
            foreach (var tb in FindVisualChildren<TextBox>(Parent).Where(tb => tb.Text == String.Empty))
            {
                collection.Add((Visual)tb);
                //tb.Background = Brushes.Red;
            }
            return collection;
        }


        public static IEnumerable<T> FindVisualChildren<T>(DependencyObject obj) where T : DependencyObject
        {
            if (obj != null)
            {
                if (obj is T)
                    yield return obj as T;

                foreach (DependencyObject child in LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>())
                    foreach (T c in FindVisualChildren<T>(child))
                        yield return c;
            }
        }
    }


Richard Deeming

Этот вопрос был решен окончательно ДВА ГОДА тому назад. И ваше решение на самом деле ничего не добавляет к принятому решению - оно даже копирует FindVisualChildren метод дословно!