Как взять дочерние элементы ListView в Code-Behind - PullRequest
0 голосов
/ 05 мая 2020

У меня есть ListView с некоторыми кнопками (созданными в коде программной части). Я хочу взять все эти кнопки и поместить их в переменную:

Button tg = (Button)sender;
ListView st = (ListView) tg.Parent;
var a = st.Children(this function doesn't work for ListView, but it's similar to what should resolve my problem) ;

foreach(Button btn in a)

1 Ответ

0 голосов
/ 06 мая 2020

Так как ListView использует виртуализацию данных для повышения производительности. См. https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/listview-and-gridview-data-optimization. Таким образом, кнопки могут не отображаться, когда они не находятся в вашем окне просмотра. Это приводит к тому, что вы не можете получить все кнопки своего ListView.

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

Предположим, вам нужен этот способ.

Сначала , вам нужно изменить ListView s ItemsPanel на StackPanel, в соответствии с сделать c, https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview#ui -виртуализацию .

        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>

Второй , вы можете получить все кнопки с помощью вспомогательной функции, она возвращает List найдены элементы управления.

public static List<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            List<T> list = new List<T>();
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        list.Add((T)child);
                    }

                    List<T> childItems = FindVisualChildren<T>(child);
                    if (childItems != null && childItems.Count() > 0)
                    {
                        foreach (var item in childItems)
                        {
                            list.Add(item);
                        }
                    }
                }
            }
            return list;
        }

В-третьих, вы можете использовать его таким образом.

        var listButtons = FindVisualChildren<Button>(listView);
        foreach (var btn in listButtons )
        {
            //to do
        }

Готово !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...