[英]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.