Нахождение фактических экстентов ListBoxItem с UserControl в качестве содержимого - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь найти экстенты элемента пользовательского интерфейса в 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 меньше)?

1 Ответ

0 голосов
/ 28 апреля 2020

В маловероятном случае, если кому-то понадобится ответ на этот вопрос, мне удалось заставить его работать следующим образом:

UIElement GetObjectHit(Point P) {
  if (!lb.IsVisible) return null;
  foreach(var i in TheCollection) {
    var item = i as SomeUserControl;
    ListBoxItem lbi = lb.ContainerFromElement(item) as ListBoxItem;
    if (lbi == null || !lbi.IsVisible)
      continue;
    Point P00 = lbi.TranslatePoint(new Point(0,0), lb);
    Point P11 = lbi.TranslatePoint(new Point(lbi.ActualWidth, lbi.ActualHeight), lb);
    if (IsBounded(P, P00, P11)
      return i;
  }
  return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...