簡體   English   中英

在組合框中,如何確定突出顯示的項目(未選擇項目)?

[英]In a combobox, how do I determine the highlighted item (not selected item)?

首先,公平警告:我是C#和WPF的全新手。

我有一個組合框(可編輯,可搜索),我希望能夠攔截刪除鍵並從列表中刪除當前突出顯示的項目。 在輸入電子郵件地址時,我正在尋找的行為類似於MS Outlook。 當您提供幾個字符時,會顯示潛在匹配的下拉列表。 如果您移動到其中一個(使用箭頭鍵)並單擊“刪除”,則會永久刪除該條目。 我想通過組合框中的條目來做到這一點。

這是XAML(簡化):


<ComboBox x:Name="Directory"
    KeyUp="Directory_KeyUp"
    IsTextSearchEnabled="True"
    IsEditable="True"
    Text="{Binding Path=CurrentDirectory, Mode=TwoWay}"
    ItemsSource="{Binding Source={x:Static self:Properties.Settings.Default}, 
        Path=DirectoryList, Mode=TwoWay}" />

處理程序是:


private void Directory_KeyUp(object sender, KeyEventArgs e)
{
    ComboBox box = sender as ComboBox;
    if (box.IsDropDownOpen &&  (e.Key == Key.Delete))
    {
        TrimCombobox("DirectoryList", box.HighlightedItem);  // won't compile!
    }
}

使用調試器時,我可以看到box.HighlightedItem具有我想要的值,但是當我嘗試輸入該代碼時,它無法編譯:

System.Windows.Controls.ComboBox' does not contain a definition for 'HighlightedItem'...

那么:我如何訪問該值? 請記住,該項目尚未被選中。 它只是在鼠標懸停在它上面時突出顯示。

謝謝你的幫助。

這是顯示調試器顯示的屏幕截圖。 我徘徊在“盒子”上,當顯示單行摘要時,我然后盤旋在+ char上以展開到這個圖像:

alt text http://www.freeimagehosting.net/uploads/2cff35d340.gif

以下是Jean Azzopardi答案啟發的最終代碼。 在調試器中顯示的HighlightedItem是非公共屬性,我使用GetType().GetProperty().GetValue()序列強制訪問GetType().GetProperty().GetValue()

private void Directory_KeyUp(object sender, KeyEventArgs e)
{
    ComboBox box = sender as ComboBox;
    if (box.IsDropDownOpen && (e.Key == Key.Delete))
    {
        const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
        PropertyInfo hl = box.GetType().GetProperty("HighlightedItem", flags);
        if (hl != null)
        {
            String hlString = hl.GetValue(sender, null) as String;
            // TODO: remove from DirectoryList
        }
    }
}

突出顯示的項目屬性是非公共成員,因此您無法從其他類調用它。

alt text http://www.freeimagehosting.net/uploads/1e4dc53cee.png

我相信你需要使用Reflection來吸引非公眾成員。 這是關於這個主題的SO帖子: 訪問非公開成員 - ReflectionAttribute

您可以創建自己的DrawItem事件處理程序,並在項目被主動繪制時保存項目的索引,並保留DrawItemState.Selected(即突出顯示的)項目。

void Main()
{
    Application.Run(new Form1());
}

public partial class Form1 : Form
{
    ComboBox ComboBox1;
    string[] ds = new string[]{"Foo", "Bar", "Baz"};

    public Form1 ()
    {
        InitializeComboBox();
    }

    private void InitializeComboBox()
    {
        ComboBox1 = new ComboBox();

        ComboBox1.DataSource = ds;
        Controls.Add(ComboBox1);

        ComboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
        ComboBox1.DrawItem += new DrawItemEventHandler(ComboBox1_DrawItem);
    }

    private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        e.Graphics.DrawString(ds[e.Index],ComboBox1.Font,Brushes.Black,e.Bounds);

        if (e.State == DrawItemState.Selected)
        {
            //stores the "HighlightedIndex" in the control's tag field.  Change as you see fit.
            ComboBox1.Tag = e.Index; 
            //Console.WriteLine(e.Index);
        }
    }
}

System.Windows.Controls.ComboBox的定義不包含屬性HighlightedItem - 這就是你的代碼無法編譯的原因。

您使用的是從System.Windows.Controls.ComboBox派生的組合框嗎? 然后將其強制轉換為適當的類型。

稍后注意:如果你想捕捉ComboBox突出顯示的事件,請閱讀鏈接 - 它正好解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM