Windows窗体 - 如何在C#中的组合框项目中添加标题无法选择?

Vin*_*alo 3 c# combobox winforms

我需要创建一个自定义组合框控件,允许标题作为分隔符,使用鼠标移动或按键不能选择.

这是一个例子:

Header1
  item1
  item2
  item3
Header2
  item4
  item5
Run Code Online (Sandbox Code Playgroud)

我尝试了很多解决方案,没有成功.提前致谢!

Fed*_*gui 5

再次,WPF可以轻松提供解决方案,需要在winforms中进行大量可怕的黑客攻击.

将我的代码复制并粘贴到Visual Studio中的文件 - >新建项目 - > WPF应用程序中.

您很快就会注意到我的解决方案不仅为Header Items提供了不同的视觉外观,而且还可以防止不必要的选择,无论是通过鼠标还是键盘,并且它不需要子类化常规的ComboBox类,这会导致较小的可维护性.

组合框

XAML:

<Window x:Class="WpfApplication5.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <ComboBox ItemsSource="{Binding}" DisplayMemberPath="DisplayText"
                  VerticalAlignment="Center" HorizontalAlignment="Center" 
                  Height="25" Width="100">
            <ComboBox.ItemContainerStyle>
                <Style TargetType="ComboBoxItem">
                    <Setter Property="Foreground" Value="Black"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsHeader}" Value="True">
                            <Setter Property="IsEnabled" Value="False"/>
                            <Setter Property="FontWeight" Value="Bold"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding IsHeader}" Value="False">
                            <Setter Property="Margin" Value="10,0,0,0"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ComboBox.ItemContainerStyle>
        </ComboBox>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

代码背后:

using System.Collections.Generic;
using System.Windows;

namespace WpfApplication5
{
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            var list = new List<ComboBoxItem>
                {
                    new ComboBoxItem {DisplayText = "Header1", IsHeader = true},
                    new ComboBoxItem {DisplayText = "Item1", IsHeader = false},
                    new ComboBoxItem {DisplayText = "Item2", IsHeader = false},
                    new ComboBoxItem {DisplayText = "Item3", IsHeader = false},
                    new ComboBoxItem {DisplayText = "Header2", IsHeader = true},
                    new ComboBoxItem {DisplayText = "Item4", IsHeader = false},
                    new ComboBoxItem {DisplayText = "Item5", IsHeader = false},
                    new ComboBoxItem {DisplayText = "Item6", IsHeader = false},
                };

            DataContext = list;
        }
    }

    public class ComboBoxItem
    {
        public string DisplayText { get; set; }
        public bool IsHeader { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)