2015-11-04 2 views
1

У меня есть визуальное дерево, которое выглядит следующим образом:WPF MouseDown событий

Border, содержащий ScrollViewer, содержащий TexBlock.

ScrollViewer занимает 100% пространства Border и TextBlock может или не может занять до 100% от пространства ScrollViewer в зависимости от того, как пользователь настраивает его.

Я хочу захватить событие MouseDown, когда пользователь нажимает в любом месте Border. Когда я регистрирую событие MouseDown для Border или ScrollViewer, обратный вызов не будет вызван. Когда я регистрирую событие MouseDown на TextBlock, обратный вызов активируется, но, конечно, только в области с кликом TextBlock, а не в полной области Border.

Одна из идей, которые у меня есть, заключается в создании какого-то элемента верхнего уровня, который будет проходить через весь элемент управления, установить видимость на скрытый, затем получить MouseDown.

Любые предложения? Если что-то неясно об этом вопросе, дайте мне знать, и я это исправлю.

Отображение Пример кода по запросу

// Need to know when a user clicks on anything inside of the border, but the 
// because there are items above it, the mouse event doesn't get invoked. 
Border border = new Border(); 
ScrollViewer viewer = new ScrollViewer(); 
TextBlock textBlock = new TextBlock(); 

border.Content = viewer; 
viewer.Child = textBlock; 
+0

Не можете найти код –

+0

@FlatEric Код слишком сложен для показа на одной странице. Как я и намекал, это часть настраиваемого пользователем приложения, поэтому она довольно динамична и абстрагирована. Я тоже не использую XAML. Лучше всего я могу создать код, который будет проще показать, и это то же самое, о чем я говорю. –

+0

Никто не хочет, чтобы вы опубликовали свой полный код. Вам нужно довести вопрос до [хорошего, _minimal_, _complete_ кода примера] (http://stackoverflow.com/help/mcve), который четко показывает, что вы пробовали, а также включает точное подробное объяснение того, что этот код делает и как это отличается от того, что вы хотите. –

ответ

1

Вы можете зарегистрировать PreviewMouseDown событие на Border. Он также срабатывает, если щелкнуть элемент-содержащий.

private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var clickedElement = e.OriginalSource; 
} 
+0

Работает как очарование, спасибо за вашу помощь. –

0

Еще один подход (хотя это не чистый ИМО), но это может быть полезно, если вам требуется некоторое пользовательское поведение ... возможно :)

Мы создаем пользовательский Зритель прокрутки, а затем использовать его вместо стандартный, наш пользовательский контроль будет просто распространять событие мыши на его родительский (этот пример упрощен, поэтому он не подходит для использования в производстве в текущем состоянии).

public class CustomScrollViewer : ScrollViewer 
{ 
    protected override void OnMouseDown(MouseButtonEventArgs e) 
    { 
     ((e.Source as FrameworkElement).Parent as UIElement).RaiseEvent(e); 
    } 
} 

Некоторая информация для людей вроде меня, которые не были знакомы с PreviewMouseDown подход - он использует стратегию маршрутизации под названием Tunneling (сверху вниз), который является противоположностью Bubbling (снизу наверх

Смежные вопросы