2012-04-24 23 views
8

私は、内部にいくつかのWPFコントロールを含むポップアップを使用していて、StaysOpen = "True"のコントロールを持っています。問題は、アプリケーションにフォーカスがないときにポップアップをクリックすると、アプリケーションがフォーカスを受け取らないことです。私は少しの研究をしましたが、これはポップアップがメニューに使われることが意図されていることが原因である可能性があります。そのため、適切なウィンドウメッセージハンドラをすべて持っているわけではありません。ここでは、問題をデモに必要最小限のサンプルです:WPFポップアップがクリックされたときにアプリケーションにフォーカスを当てない

<Window x:Class="TestWindowPopupBehavior.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:TestWindowPopupBehavior="clr-namespace:TestWindowPopupBehavior" Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Popup StaysOpen="True" IsOpen="True" Placement="Center"> 
     <ListBox> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
     </ListBox> 
    </Popup> 

</Grid> 
</Window> 
  1. は、アプリケーションを実行します。
  2. リストボックスとのやりとりがうまくいくはずです。
  3. 別のアプリケーションに切り替えます。
  4. アプリケーションがアクティブでない間にリストボックスをクリックします。何も起こらない
  5. リストボックスの外にあるアプリケーションをクリックします。
  6. リストボックスをクリックします。それは今働いている。

私はステップ4でアプリケーションがフォーカスを受け取り、リストボックスが新しいアイテムを選択することが予想されます。

この問題の回避策はありますか、それとも明らかに欠けていますか?私は完全なポップアップコードを本格的なウィンドウで書き直し、私たちが持っている振る舞いを再実装しようとしていますが、これはちょうどこのような小さな問題を解決するのに本当に複雑に思えます。

答えて

4

MouseLeftButtonDownイベントを処理する場合は、Window.Activate()メソッドを呼び出すことができます。各要素(Popup)とすべてのTextBlock(s)についてそれを記述する必要があります。

あなたが遭遇する問題は、Windowsではマウスのボタンを入れ替えることができます。マウスのボタンは入れ替えることができます(左は正しかったが、その仕方は分かりません)。MouseRightButtonDownイベントを処理する必要があるかもしれません。

+3

プレビュー...マウスイベントを使用すると、コンテンツのハンドラを追加することなく、ポップアップでイベントをトラップするだけで十分です。 – Paul

+0

私はPreviewXXXを使っていました。 – FryGuy

+0

あなたはプレビューのことについてより具体的になりますか?私は同じ問題を抱えているようです。 –

関連する問題