【WPF】ComboBox上でDownキー押していきなりドロップダウンリストを開く

***いいね、よくないね、ブラウザバック、ささやかな善意が励みになります(定型文)***


今やってる事が死ぬほど時間が掛かってるせいでなかなか更新できない。。。毎日やれるほど器用でもないし。



$\color{lightblue}{\tiny \textsf{そろそろ派遣の仕事辞めたいので誰か雇ってくだちい。}}$




なんか昔のWinForm系のふっるい記事なんかで見かける${\tiny \textsf{※1}}$ Override void ON○○Changed　とかしてオーバーライドする今更何番煎じか分からんようなやつ${\tiny \textsf{※2}}$ 。default動作を抑制したり、別の処理に置き換えたり。
```e.Handled = true```のやつですね。


$\color{Gray}{\tiny \textsf{※1.〇obon.netとか WPF入ってないしもういらないだろあのサイト}}$


$\color{Gray}{\tiny \textsf{※2.Overrideすら不要だった}}$


本当はカスタムコントロールでTextBoxとListBox組み合わせて作ろうかなと思ってたんだけど、弄ってたらそこまでしなくて良さそうに思えたんで~~例によってやたら時間かかったが~~
まあ何とか出来ちゃったという件です。


コールスタック（呼び出し履歴)なんかもGPTに解析させたりしたんだけど結局なんとなくでやってしまった。


# 参考Link


***ルーティング イベントを処理済みとしてマークし、クラスレベルで処理を行う***


https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/events/marking-routed-events-as-handled-and-class-handling

無駄に難解な翻訳で悪名高いMicrosoft Learnドキュメント。さっぱりわからない。

**ComboBoxで、PreviewKeyDown時の矢印キーを認識したい**

https://qiita.com/hiro_t/items/82fd9bd16c90e9ebd538

この件ではPreviewKeyDownが上手くいかなかったので参考になりますね。

# ComboBoxのDownキー(↓下矢印キー)押したときのデフォルト動作

以下のように、defaultでは内部に格納されたItemが選択されます。
```ComboBox.isEditable = true```の場合です。
![bandicam 2025-06-22 16-48-13-697_Harua.mp4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/978ecd26-0c4f-41c1-b76d-446eae367682.gif)

AIに聞いたら、相当内部的にイベント伝播させてるようです。

# ダウンキーでいきなりDropDownList(ドロップダウンリスト)を呼びたい

SelectionChangedイベントを使えばいけます。(色々試してるうちにこれがヒットしただけ)

# いきなり実行結果
![bandicam 2025-06-22 16-57-11-725_Harua.mp4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/c69017eb-e87b-49e9-8a9a-884bdb7c35f5.gif)


今回は単純だからGit要らんと思うけど、必要なら用意します（笑）


# XAMLとコードビハインド

```xml:外観
<Window x:Class="TextBoxtoComboBox.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"
        xmlns:local="clr-namespace:TextBoxtoComboBox"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel Orientation="Vertical">
            <ComboBox
         IsEditable="True"
         FontSize ="30"
        Name="nomalComboBox" Width="200" Margin="10" >
                <ComboBoxItem Content="羊女 1" />
                <ComboBoxItem Content="羊女 2" />
                <ComboBoxItem Content="羊女 3" />
            </ComboBox>
            <ComboBox IsEditable="True" 
FontSize ="30" 
x:Name="comboBox" Width="200" Margin="10" Loaded="comboBox_Loaded"            
            
            IsTextSearchEnabled="True"             
            SelectionChanged="comboBox_SelectionChanged"            
            >
                <ComboBoxItem Content="Item 1" />
                <ComboBoxItem Content="Item 2" />
                <ComboBoxItem Content="Item 3" />
            </ComboBox>
            <Button Content="Add Text to ComboBox" Width="200" Margin="10"
                    Click="Button_Click"/>
            
        </StackPanel>
    </Grid>
</Window>

```

コードビハインド

```cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace TextBoxtoComboBox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            comboBox.Text = nomalComboBox.Text; // Set the ComboBox text to the TextBox text
        }

        private void comboBox_Loaded(object sender, RoutedEventArgs e)
        {

        }






        private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            e.Handled = true; // Suppress the selection change event


            if (Keyboard.IsKeyDown(Key.Down) || Keyboard.IsKeyDown(Key.Up) && !comboBox.IsDropDownOpen)
                comboBox.IsDropDownOpen = true; // Ensure the dropdown remains open after selection change
        }


    }
}
```

```Keyboard.IsKeyDown(Key.Down)```は便利なクラスメソッドです。e.Keyの判定が使えないときに。汎用的にどのイベント上でも使える利点がある


https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.input.keyboard.iskeydown?view=windowsdesktop-9.0




# あとがき

投稿日から一年間いいね付かなければ消します。
ゼッタイ誰かが書いてそうなんだよなコレ。その辺のblogなんかで


# 余談
カスタム(自作)クラス作って内部で```override```しても普通に抑制は出来るけどそんなに使い勝手は良くないです。反応悪い。

もちろん無くても動くし両方入れたら切り分けがめんどいのでやめましょう。~~混ぜるなめんどい。~~

```cs:SuppresComboBox
using System.Windows.Controls;
using System.Windows.Input;

namespace TextBoxtoComboBox
{
    public class SuppresComboBox : ComboBox
    {
        public SuppresComboBox()
        {

        }

        protected override void OnSelectionChanged(SelectionChangedEventArgs e)
        {
            e.Handled = true; // ここで選択変更イベントを抑制
            
        }
        // Override the OnApplyTemplate method to suppress the Down key
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            var textBox = GetTemplateChild("PART_EditableTextBox") as TextBox;
            if (textBox != null)
            {
                textBox.PreviewKeyDown += (s, e) =>
                {

                    if (e.Key == Key.Down)
                    {
                        e.Handled = true; // Suppress the Down key to prevent default behavior
                        IsDropDownOpen = true; // Open the dropdown when Down key is pressed

                    }
                };
            }
        }
    }

}

```