11

いくつかのWPFコントロールが内部にあるポップアップを使用しているコントロールとStaysOpen="True"があります。問題は、アプリケーションにフォーカスがないときにポップアップをクリックすると、アプリケーションがフォーカスを受け取らないことです。少し調べてみましたが、これはポップアップがメニューに使用されることを意図しているため、適切なWindowsメッセージハンドラーがすべて接続されていないことが原因のようです。問題をデモするための最低限のサンプルを次に示します。

<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

2 に答える 2

6

イベントを処理する場合は、メソッドMouseLeftButtonDownを呼び出すことができますWindow.Activate()。ただし、要素ごとPopup、およびすべてTextBlockの s に対して記述する必要があります。

あなたが遭遇できる問題は、Windowsでは左が右になったマウスボタンを交換できることです(ただし、これがどのように機能するかはわかりません)ので、MouseRightButtonDownイベントを処理する必要があるかもしれません.

于 2012-04-24T08:37:33.867 に答える