Как определить границы элемента управления WPF в C # во время выполнения? - PullRequest
4 голосов
/ 05 июня 2009

У меня есть окно с несколькими элементами управления Frame, и я хотел бы найти границы / прямоугольники элементов управления во время выполнения. Они входят в сетку окна с использованием XAML с атрибутами Height / Width / Margin.

Элемент управления Frame не имеет свойств Bounds, Rect, Top или Left.

Цель состоит в том, чтобы проверить каждый кадр, чтобы увидеть, находится ли мышь внутри, когда происходят другие события. Моя текущая работа заключается в установке / очистке логических флагов в обработчиках MouseEnter и MouseLeave, но должен быть лучший способ. Это может быть очевидно, потому что я новичок в C # WPF и .NET.

Ответы [ 3 ]

5 голосов
/ 26 января 2010

Хотя другие удовлетворяли эту потребность, как обычно, никто не ответил на проклятый вопрос. Я могу придумать любое количество сценариев, которые требуют определения границ. Например, отображение HTML может быть выполнено с помощью IFRAME на главной странице HTML, а возможность позиционировать его в соответствии с визуализированными границами панели позволит вам легко интегрировать его в свой пользовательский интерфейс.

Вы можете определить происхождение элемента управления, используя GeneralTransform on Point (0,0) для корневой визуальной системы координат, а ActualHeight и ActualWidth отображаются непосредственно.

GeneralTransform gt = 
  TransformToVisual(Application.Current.RootVisual as UIElement);
Point offset = gt.Transform(new Point(-1, -1));
myFrame.SetStyleAttribute("width", (ActualWidth + 2).ToString());
myFrame.SetStyleAttribute("height", (ActualHeight + 2).ToString());
myFrame.SetStyleAttribute("left", offset.X.ToString());
myFrame.SetStyleAttribute("top", offset.Y.ToString());
myFrame.SetStyleAttribute("visibility", "visible");

В приведенном выше примере я преобразовал (-1, -1) и добавил 2 к высоте и ширине, чтобы компенсировать область границы в один пиксель вокруг IFRAME - этот код извлекается из рабочего приложения, которое использует IFRAME для отображать «встроенный» HTML при размещении в браузере.

Кроме того, существует более одного способа снятия шкуры с кошки, и для тестирования попадания вы можете найти VisualTreeHelper интересным.

IEnumerable<UIElement> VisualTreeHelper
  .FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree)

Возвращает каждый элемент UIE под точкой (обычно от мыши). Существует перегрузка, которая принимает Rect вместо этого.

3 голосов
/ 06 июня 2009

Почему бы вам просто не протестировать свойства IsMouseOver или IsMouseDirectlyOver?

1 голос
/ 05 июня 2009

вы можете перемещаться по элементам управления с помощью VisualTreeHelper и видеть, находится ли курсор в элементе с помощью VisualTreeHelper.HitTest(...) метода

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