33916


OS: Windows7、Windows10  
.NET Framework: 3.0、4.5  
開発環境: VisualStudio 2013、VisualStudio 2015

`Popup`の中に`ComboBox`を入れて表示していたのですが、  
想定していたものとは異なる動作をしました。

XAML

[code]

    <Window 
        x:Class="SandBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="100">
        <Grid>
            <Button Click="OnClick">
                <StackPanel>
                    <TextBlock Text="ボタン"/>
                    <Popup x:Name="Popup" StaysOpen="False">
                        <StackPanel>
                            <TextBlock Text="ポップアップ" Background="White"/>
                            <ComboBox x:Name="ComboBox">
                                <ComboBoxItem><TextBlock Text="選択肢1"/></ComboBoxItem>
                                <ComboBoxItem><TextBlock Text="選択肢2"/></ComboBoxItem>
                                <ComboBoxItem><TextBlock Text="選択肢3"/></ComboBoxItem>
                            </ComboBox>
                        </StackPanel>
                    </Popup>
                </StackPanel>
            </Button>
        </Grid>
    </Window>
    
[/code]

C#

[code]

    private void OnClick(object sender, RoutedEventArgs e)
    {
        Popup.IsOpen = true;
        DispatcherTimer timer = new DispatcherTimer();
        timer.Tick += delegate
        {
            // Popup.StaysOpen = true;
            ComboBox.IsDropDownOpen = false;
            // Popup.StaysOpen = false;
            timer.Stop();
        };
        timer.Interval = TimeSpan.FromSeconds(3.0);
        timer.Start();
    }
    
[/code]

操作手順は以下の通りです。

  1. ボタンをクリックします。
  2. コンボボックスが表示されるので、  
コンボボックスをクリックしてドロップダウンリストを表示させます。

  3. ドロップダウンリストが表示されたままの状態で、  
マウスカーソルをウインドウ外へ移動させます。

  4. タイマーが作動しドロップダウンリストが閉じると、ポップアップも閉じてしまいます。  
これはマウスカーソルがウインドウ内の場合は起こりません。

実はコメントアウトしている`StaysOpen`を直前と直後に変更する方法で回避はできるのですが、  
結局`ComboBox`と`Popup`の何が悪さをしているのかまでは分かりませんでした。

この現象は一体なぜ起きるのでしょうか？


CC BY-SA 3.0
2017-04-10T13:26:00.677
33911
2017-04-10T18:14:00.333
70
question
wpf
ComboBoxの動作にPopupが影響を受ける原因は？


`Popup.StaysOpen`を`true`に設定している場合、`Popup`は自要素外のマウスイベントを受け取ってポップアップを閉じることになります。ですので内部的にはポップアップウィンドウの表示後にマウスキャプチャーを`SubTree`モードで取得し、閉じられたときに解放するという動作をします。これは`ComboBox`のテンプレートに含まれる`Popup`についても同様です。

質問の事象は`ComboBox`のドロップダウンが閉じられた際にマウスキャプチャーが変更されるのですが、これが`Popup`に移行するとは限らないために発生しています。おそらく`Mouse`や`MouseDevice`の都合でヒットテストが行われているのでしょう。


CC BY-SA 3.0
2017-04-10T18:14:00.333
33916
2017-04-10T18:14:00.333
5750
33911
answer