6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-06-22

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

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

$\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

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

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

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

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

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

以下のように、defaultでは内部に格納されたItemが選択されます。
ComboBox.isEditable = trueの場合です。
bandicam 2025-06-22 16-48-13-697_Harua.mp4.gif

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

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

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

いきなり実行結果

bandicam 2025-06-22 16-57-11-725_Harua.mp4.gif

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

XAMLとコードビハインド

外観
<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>

コードビハインド


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の判定が使えないときに。汎用的にどのイベント上でも使える利点がある

あとがき

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

余談

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

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

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

                    }
                };
            }
        }
    }

}

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?