2012-03-06 64 views
1

我創建了一個WPF應用程序,其中包含一個「主要內容」 - 包含一個TabControl和一個「對話框」的圖層 - 包含一個ItemsControl的圖層。WPF中的「模態對話框」 - 使覆蓋塊關鍵事件

的XAML看起來是這樣的:

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

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

通常 「Dialog1Property」 和 「Dialog2Property」 是空的,這意味着ItemsControl的是看不見的。每當我爲其中的一個分配一個控件時,它就會顯示在TabControl的前面,這正是我想要的。如果我將不透明度爲0.7的灰色Rectangle指定給其中一個對話框屬性,則會創建一個灰色疊加層。

如果我點擊通過覆蓋層可以看到的標籤,則沒有任何反應 - 矩形會阻止鼠標事件。但是,仍然可以使用Tab-Key將TabControl聚焦到疊加層後面,因此即使顯示了對話框,也可以切換製表符。

有沒有一種簡單的方法來告訴矩形以某種方式阻止鍵盤事件,因爲它已經做好了Mouseclicks的準備?

問候 BBRain

回答

1

是的,你的矩形,訂閱事件PreviewKeyDown。

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

在其處理程序中,只需設置e.Handled = true;

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

由於與「預覽...」爲前綴的路由事件是隧道,您的矩形下的元素不會收到輸入。

+0

這可能會解決問題,如果PreviewKeyDown - 事件將被解僱,似乎並非如此。任何想法爲什麼? PreviewMouseDown - 事件被正確觸發。當然,這並沒有多大幫助,因爲Mouseclicks被阻止了所有的準備... – BoltzmannBrain 2012-03-06 11:36:09

+0

我通過在我的XAML結尾使用了一個文本框來繞過這個問題。然後,我創建了一個DataTrigger,對該文本框的「IsFocused」屬性的更改作出反應,其中我通過FocusManager的AttachedProperty將Focus設置爲對話框中的第一個元素,以便在對話框中重點排序循環。無論如何,我會接受你的答案,因爲它聽起來像是正確的解決方案,它不起作用的原因可能是與我的其他源代碼有關的問題。 – BoltzmannBrain 2012-03-06 13:35:31