Дочерний элемент управления, блокирующий обработчик событий родителя - PullRequest
1 голос
/ 24 мая 2011

У меня есть пользовательский элемент управления с зарегистрированным обработчиком событий MouseDown.Пользовательский элемент управления имеет ScrollViewer с ItemsControl и TextBlock.Видимость ItemsControl и TextBlock переключается обработчиком событий MouseDown, поэтому в каждый момент времени виден только один из них.Обработчик событий вызывается правильно, когда я щелкаю TextBlock, но не в ItemsControl.

Если я установлю «IsHitTestVisible» на ItemsControl на false, то обработчик событий представления будет выставлен, но я не могу прокрутить.

Может кто-нибудь предложить выход, пожалуйста?

Код выглядит примерно так:

<Grid>
 <Border>
  <ScrollViewer>
   <TextBlock>
  </ScrollViewer>
 <Border>
 <Border>
  <Grid>
   <ItemsControl/> <!-- Has a ScrollViewer in template to show scroll bar -->
  </Grid>
 <Border>
</Grid>

1 Ответ

0 голосов
/ 24 мая 2011

Ваш сценарий пользовательского интерфейса звучит немного странно для меня, но если вы все еще хотите реализовать его, вы можете сделать следующее. Вы не получите событие для парена, потому что ItemsControl помечает его как обработанное, поэтому он не направляется дальше . Вы можете подписаться на событие PreviewMouseDown вместо MouseDown в родительском элементе. Тогда независимо от того, что родитель получит уведомление, прежде чем его дети.

UPDATE

Вы можете сделать следующее

<ScrollViewer>
    <Grid MouseDown="HandleMouseDown">
        <TextBlock />
        <ItemsControl IsHitTestVisible="false"/>
    </Grid>
</ScrollViewer>

Таким образом, у вас будет свиток для текстового блока и для элементов. Полосы прокрутки ItemsControl не будут использоваться.

ОБНОВЛЕНИЕ 2

Если вы хотите иметь отдельные ScrollViewers, то другая возможность может быть следующей (хотя я думаю, что некоторые границы и сетки действительно не нужны. Только если они функциональны в вашем фрагменте)

  <Grid>
    <Border>
      <ScrollViewer>
        <TextBlock MouseDown="HandleMouseDown">
      </ScrollViewer>
    <Border>
    <Border>
      <Grid>
        <ScrollViewer>
          <Grid MouseDown="HandleMouseDown">
            <ItemsControl IsHitTestVisible="false"/>
          </Grid>
        </ScrollViewer>
      </Grid>
    <Border>
  </Grid>
...