Способ получения «события нажатия кнопки» для элемента управления WPF ScrollViewer - PullRequest
0 голосов
/ 08 февраля 2011

Мой пользовательский элемент управления использует ScrollViewer, и я хочу определить, когда пользователь нажимает кнопку увеличения горизонтальной прокрутки , в то время как элемент управления уже прокручивается до максимума по горизонтали.

Зрительсодержит холст, и идея заключается в том, что холст расширится, если пользователь попытается прокрутить его экстент с помощью кнопок.

ScrollViewer, похоже, не имеет каких-либо событий, которые конкретно относятся к кнопкам и ScrollChanged сам по себе бесполезен, так как не срабатывает, когда гистограмма находится на своем экстенте.

.Net Reflector не принес большой пользы.Самое близкое, что я могу получить, это добавить обработчик события mouseLeftButtonDown, я могу видеть состояние зрителей, но не могу определить, произошло ли событие мыши от кнопки.

Кто-нибудь может придумать, как это сделать?

1 Ответ

1 голос
/ 08 февраля 2011

Вы можете попытаться получить кнопки элемента управления через VisualTree и прикрепить обработчик к их событиям щелчка.

Редактировать: я написал метод расширения для получения элементов визуального дерева через путь:

public static class ExtensionMethods
{
    public static DependencyObject GetVisualChildFromTreePath(this DependencyObject dpo, int[] path)
    {
        if (path.Length == 0) return dpo;
        List<int> newPath = new List<int>(path);
        newPath.RemoveAt(0);
        return VisualTreeHelper.GetChild(dpo, path[0]).GetVisualChildFromTreePath(newPath.ToArray());
    }
}

Если ваш ScrollViewer называется sv, вы можете получить такие кнопки:

RepeatButton button1 = sv.GetVisualChildFromTreePath(new int[] { 0, 2, 0, 0 }) as RepeatButton; //Up
RepeatButton button2 = sv.GetVisualChildFromTreePath(new int[] { 0, 2, 0, 2 }) as RepeatButton; //Down
RepeatButton button3 = sv.GetVisualChildFromTreePath(new int[] { 0, 3, 0, 0 }) as RepeatButton; //Left
RepeatButton button4 = sv.GetVisualChildFromTreePath(new int[] { 0, 3, 0, 2 }) as RepeatButton; //Right

Примечание. Кнопки существуют, только если активирована соответствующая полоса прокрутки.Вероятно, метод расширения можно улучшить с точки зрения производительности, используя другие типы данных.

...