いいね、よくないね、ブラウザバック、ささやかな善意が励みになります(定型文)
今やってる事が死ぬほど時間が掛かってるせいでなかなか更新できない。。。毎日やれるほど器用でもないし。
$\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
の場合です。
AIに聞いたら、相当内部的にイベント伝播させてるようです。
ダウンキーでいきなりDropDownList(ドロップダウンリスト)を呼びたい
SelectionChangedイベントを使えばいけます。(色々試してるうちにこれがヒットしただけ)
いきなり実行結果
今回は単純だから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
しても普通に抑制は出来るけどそんなに使い勝手は良くないです。反応悪い。
もちろん無くても動くし両方入れたら切り分けがめんどいのでやめましょう。混ぜるなめんどい。
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
}
};
}
}
}
}