none
WPF ComboBoxItemのフォーカス色を制御したい RRS feed

  • 質問

  • ComboBoxの選択項目の第1行をタイトルとして使いたいと思っています。
    このため、MouseEnter時やキーボードでフォーカスされた時に色が変わらないようにしたいです。
    画像では、第1行をタイトルにしていますが、背景色が青に変わっているので「NG」です。

    処理に柔軟性を持たせたいので、XAMLではなくVB.netでの解決方法を教えて下さい。

    Class MainWindow
        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

            Me.CB1.Items.Add(New ComboBoxItem_user("No.", "content"))
            Me.CB1.Items.Add(New ComboBoxItem_user("001", "AAAA"))
            Me.CB1.Items.Add(New ComboBoxItem_user("002", "bbbA"))

            Me.CB1.IsDropDownOpen = True

        End Sub

    End Class

    Public Class ComboBoxItem_user
        Inherits ComboBoxItem
        Public Sub New(ByVal s1 As String, ByVal s2 As String)

            Dim sp1 As New StackPanel
            sp1.Orientation = Orientation.Horizontal


            Dim lb1 As New Label
            lb1.HorizontalContentAlignment = HorizontalAlignment.Center
            lb1.Content = s1 & " "
            lb1.Background = Brushes.White

            Dim lb2 As New Label
            lb2.HorizontalContentAlignment = HorizontalAlignment.Center
            lb2.Content = s2
            lb2.Background = Brushes.LightCyan

            sp1.Children.Add(lb1)
            sp1.Children.Add(lb2)

            Me.Content = sp1

        End Sub
    End Class

    <Window x:Class="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:WpfApp10420"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <ComboBox x:Name="CB1" HorizontalAlignment="Left" Height="49.437" Margin="174.732,133.718,0,0" VerticalAlignment="Top" Width="204.085"/>

        </Grid>
    </Window>

    2021年4月20日 3:41

回答

  • Class MainWindow
        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
            Dim first = New ComboBoxItem_user("No.", "content")
            first.IsHitTestVisible = False
            first.Focusable = False
            first.IsTabStop = False
    
            Me.CB1.Items.Add(first)
            Me.CB1.Items.Add(New ComboBoxItem_user("001", "AAAA"))
            Me.CB1.Items.Add(New ComboBoxItem_user("002", "bbbA"))
    
            AddHandler CB1.PreviewKeyDown _
                , Sub(s2, e2)
                      If Not CB1.IsDropDownOpen Then
                          Select Case e2.Key
                              Case Key.Up
                                  If CB1.SelectedIndex = 1 Then
                                      e2.Handled = True
                                  End If
    
                              Case Key.Down
                                  If CB1.SelectedIndex = -1 Then
                                      e2.Handled = True
                                      If CB1.Items.Count < 2 Then
                                          Return
                                      Else
                                          CB1.SelectedIndex = 1
                                          Return
                                      End If
                                  End If
                          End Select
                      End If
                  End Sub
    
            Me.CB1.IsDropDownOpen = True
    
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク huahi11112 2021年4月21日 3:13
    2021年4月20日 12:57

すべての返信

  • Class MainWindow
        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
            Dim first = New ComboBoxItem_user("No.", "content")
            first.IsHitTestVisible = False
            first.Focusable = False
            first.IsTabStop = False
    
            Me.CB1.Items.Add(first)
            Me.CB1.Items.Add(New ComboBoxItem_user("001", "AAAA"))
            Me.CB1.Items.Add(New ComboBoxItem_user("002", "bbbA"))
    
            AddHandler CB1.PreviewKeyDown _
                , Sub(s2, e2)
                      If Not CB1.IsDropDownOpen Then
                          Select Case e2.Key
                              Case Key.Up
                                  If CB1.SelectedIndex = 1 Then
                                      e2.Handled = True
                                  End If
    
                              Case Key.Down
                                  If CB1.SelectedIndex = -1 Then
                                      e2.Handled = True
                                      If CB1.Items.Count < 2 Then
                                          Return
                                      Else
                                          CB1.SelectedIndex = 1
                                          Return
                                      End If
                                  End If
                          End Select
                      End If
                  End Sub
    
            Me.CB1.IsDropDownOpen = True
    
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク huahi11112 2021年4月21日 3:13
    2021年4月20日 12:57
  • XAML不使用で御回答いただき、どうもありがとうございました。
    キー操作で1行目の選択がされた時など、細かい処理まで作成していただき、大変助かりました。自分では理解していないe.Handled = True を使っていますので、おそらく自力では作成できなかったと思います。

    2021年4月21日 3:21