3

ヘッダーをセパレーターとして使用できるカスタム コンボ ボックス コントロールを作成する必要があります。これは、マウスの移動またはキーの押下を使用して選択できないようにする必要があります。

これは例です:

Header1
  item1
  item2
  item3
Header2
  item4
  item5

多くの解決策を試しましたが、成功しませんでした。前もって感謝します!

4

2 に答える 2

6

繰り返しますが、WPF は、winform で大量の恐ろしいハックを必要とするソリューションを簡単に提供できます。

コードをコピーして、Visual Studio の [ファイル] -> [新しいプロジェクト] -> [WPF アプリケーション] に貼り付けます。

私のソリューションは、ヘッダー項目に異なる視覚的外観を提供するだけでなく、マウスまたはキーボードによる不要な選択を防ぎ、通常の 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>

コードビハインド:

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; }
    }
}
于 2013-02-14T01:32:28.287 に答える
2

このカスタム コンボ ボックスを試してください。ヘッダーは無視されますが、ヘッダーは他のアイテムとまったく同じように描画され、サブアイテムを選択すると、余分なスペースが含まれます。しかし、これがあなたを正しい方向に導くことを願っています。

public class CustomComboBox : ComboBox
{
    int currentlySelectedIndex = -1;

    protected override void OnSelectionChangeCommitted(EventArgs e)
    {
        if (this.SelectedIndex != -1)
        {
            // Check if we shouldn ignore it:
            object currentlySelectedItem = this.Items[this.SelectedIndex];

            if (ShouldIgnore(currentlySelectedItem))
            {
                Console.WriteLine("Ignoring it! Resetting the index.");

                this.SelectedIndex = currentlySelectedIndex;
            }
        }

        base.OnSelectionChangeCommitted(e);
    }

    protected virtual bool ShouldIgnore(object selectedItem)
    {
        // This is a category if it starts with a space. 
        return !selectedItem.ToString().StartsWith(" ");     
    }

    protected override void OnDropDown(EventArgs e)
    {
        // Save the current index when the drop down shows:
        currentlySelectedIndex = this.SelectedIndex;

        base.OnDropDown(e);
    }
}
于 2013-02-14T01:25:25.993 に答える