Я пытаюсь найти экстенты элемента пользовательского интерфейса в ListBox. Я использую WPF / c# для этого. Код примерно такой:
ObservableCollection<SomeUserControl> TheCollection = new ObservableCollection<SomeUserControl>();
// setup
ListBox lb = new ListBox();
// code omitted here that setup the listbox with 2 columns
lb.ItemsSource = TheCollection;
// code omitted here that populates TheCollection with UI elements
Затем я регистрирую событие мыши, и мне хотелось бы знать, когда указанная точка c ограничена указанным элементом c в списке. Для этого у меня есть следующие способы сделать это:
UIElement GetObjectHit(Point P) {
if (!lb.IsVisible) return null;
foreach(var i in TheCollection) {
FrameworkElement item = i as FrameworkElement;
if (item == null || !item.IsVisible)
continue;
Point P00 = item.TranslatePoint(new Point(0,0), lb);
Point P11 = item.TranslatePoint(new Point(item.ActualWidth, item.ActualHeight), lb);
if (IsBounded(P, P00, P11)
return item;
}
return null;
}
UIElement GetObjectHit(MouseButtonEventArgs e) {
return GetObjectHit(e.GetPosition(lb));
}
Это прекрасно работает с одним исключением ... У разных пользовательских элементов управления есть разные размеры, и ListBox будет расширять каждый элемент до максимального элемента. Размер в настоящее время в списке, а затем центрируйте меньшие пользовательские элементы управления в списке.
Так в чем же проблема? Хорошо, когда позиция находится в белой области, которая находится внутри области ListBoxItem, но за пределами области UserControl, приведенный выше код не может найти пересечение.
Так что мой вопрос заключается в следующем: я должен сделать отдельную l oop сначала получить максимальные расширения каждого элемента пользовательского интерфейса или есть ли способ получить текущий экстент ListBoxItem в ListBox (даже если экстент UserControl меньше)?