

## 質問

これは、wpf(C#)での質問です。  
コンボボックスにあるマウスカーソルを離したときに、開いていたコンボボックスのドロップダウンを閉じるという処理で、マウスカーソルのある動作パターンのみドロップダウンを閉じない様にしたいのですが、その方法がわかりませので質問します。

問題のパターンは、コンボボックスにあるマウスカーソルを、クリックした後、ドロップダウンと同じ方向へ移動しコンボボックスに離すパターンです。  
もしドロップダウンが完全に下がりきっていれば問題ないのですが、下がり切る前にコンボボックスから離すと、ドロップダウンが閉じてしまいます。  
このときだけ、ドロップダウンを閉じずに、完全に表示したいのです。

その方法をご教授お願いします。

今回、使っているイベントは、`IsMouseDirectlyOverChanged`を使っています。

[![コンボボックスのイベント](https://i.stack.imgur.com/Qbwyn.png)](https://i.stack.imgur.com/Qbwyn.png)

[![問題のパターン](https://i.stack.imgur.com/9Hgjh.png)](https://i.stack.imgur.com/9Hgjh.png)

## やったこと

私の調査したことは、「ドロップダウンの表示が不完全か完全化を判断するフラグ」を、google usで、以下ののキーワードで検索しました。  
・combobox dropdown open complete event  
・c# Combobox dropdown close soon can click  
・combobox dropdown down end event  
その結果、思った通りの結果が得られませんでした。

## ソースコード

MainWindow.xaml

[code]

    <Window x:Class="ControlTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            mc:Ignorable="d"
            Title="MainWindow" Height="200" Width="200">
        <Grid>
            <ComboBox IsMouseDirectlyOverChanged="cmb_IsMouseDirectlyOverChanged"
                      Width="90"
                      Height="30"
                      x:Name="cmb">
                <ComboBoxItem>a</ComboBoxItem>
                <ComboBoxItem>b</ComboBoxItem>
                <ComboBoxItem>c</ComboBoxItem>
                <ComboBoxItem>d</ComboBoxItem>
                <ComboBoxItem>e</ComboBoxItem>
                <ComboBoxItem>f</ComboBoxItem>
                <ComboBoxItem>g</ComboBoxItem>
            </ComboBox>
        </Grid>
    </Window>
    
    
[/code]

MainWindow.xaml.cs

[code]

    using System.ComponentModel;
    using System.Windows;
    
    namespace ControlTest
    {
    
        public partial class MainWindow : Window
        {
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            // イベント「IsMouseDirectlyOverChanged」によって、
            // ドロップダウンを閉じる。
            private void cmb_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e)
            {
                cmb.IsDropDownOpen = false;
            }
        }
    }
    
[/code]

## 注意

問題のパターンは、瞬間的に発生します。クリックして、ほぼ同時にマウスを離すと、発生します。離すスピードが遅いと、問題のないパターンになります。


CC BY-SA 4.0
2022-07-15T10:42:21.207
90002
2022-07-15T12:55:15.100
52993
question
c# wpf
コンボボックスにあるマウスカーソルを離したときの、コンボボックスのイベントを制御する方法をお願いします。（イベントはIsMouseDirectlyOverChanged）


基本的にコンボボックスにそのような制御を入れてしまうこと自体推奨できませんが、どうしても実装したい場合どうするべきか検討してみました。

そこで考えたのが、逆転の発想でコンボボックスのアニメーションを無効にしてしまうのはいかがでしょうか。  
Visual Studio 2022、.NET 6であれば、以下のような操作で無効にできました。

  1. まずはコンボボックスのプロパティからTemplateを見つけ出し、円柱のアイコンの右側にある[▼]をクリックします。

[![プロパティのTemplate](https://i.stack.imgur.com/qMq4p.png)](https://i.stack.imgur.com/qMq4p.png)

  2. メニューから[新しいリソースに変換...]を選択します。

[![新しいリソースに変換](https://i.stack.imgur.com/TbtI8.png)](https://i.stack.imgur.com/TbtI8.png)

  3. [ControlTemplate リソースの作成]が表示されたら、[OK]をクリックします。

[![ControlTemplateリソースの作成](https://i.stack.imgur.com/lcz6W.png)](https://i.stack.imgur.com/lcz6W.png)

  4. XAMLにControlTemplateが追加されるので、その中からPopupを探し出し、PopupAnimationを"None"に変更してください。

[![PopupAnimationの元の値](https://i.stack.imgur.com/4rqcA.png)](https://i.stack.imgur.com/4rqcA.png)

  5. 後はそのままビルドすれば、コンボボックスのアニメーションが無効になっています。ドロップダウンが瞬時に表示されるようになるので、質問にある問題は発生しなくなるはずです。


CC BY-SA 4.0
2022-07-15T12:47:50.030
90003
2022-07-15T12:55:15.100
2022-07-15T12:55:15.100
70
70
90002
answer