«Модальный диалог» в WPF - сделать ключевые события блока оверлея - PullRequest
1 голос
/ 06 марта 2012

Я создаю приложение WPF, содержащее «Main-Content» - слой, содержащий TabControl, и «Dialog» - слой, содержащий ItemsControl.

XAML выглядит так:

<Grid>
  <TabControl>
    ..Some Tabs
  </TabControl>

  <ItemsControl>
      <ContentControl Content={Binding Dialog1Property} />
      <ContentControl Content={Binding Dialog2Property} />
  </ItemsControl>
</Grid>

Обычно "Dialog1Property" и "Dialog2Property" имеют значение null, что означает, что ItemsControl невидим. Всякий раз, когда я назначаю элемент управления одному из них, он отображается перед TabControl, и это именно то, что мне нужно. Если я назначу серый прямоугольник с непрозрачностью 0,7 одному из свойств диалогового окна, он создаст серый наложение.

Если я нажимаю на вкладку, которая слегка видна через наложение, ничего не происходит - прямоугольник блокирует события мыши. Однако все еще возможно сфокусировать TabControl за оверлеем, используя клавишу Tab, и, следовательно, также возможно переключать вкладки, даже если отображается диалог.

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

С уважением BBRain

1 Ответ

1 голос
/ 06 марта 2012

Да, на вашем Rectangle, подпишитесь на событие PreviewKeyDown.

<Rectangle Opacity="0.7" Fill="Green" PreviewKeyDown="Rectangle_PreviewKeyDown" />

В его обработчике просто установите e.Handled = true;

private void Rectangle_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            e.Handled = true;
        }

Так как перенаправленные события начинаются с префикса«Предварительный просмотр ...» - это туннелирование, элементы под вашим прямоугольником не получат ввод.

...