Так как 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
}
Готово !!!