我正在創建一個自定義的組合框控件與谷歌搜索結果實現,但我遇到了一些問題,使用箭頭鍵。問題
的組合框上/下箭頭鍵問題項目重新填充
詳情我演示用上下箭頭鍵的問題,請觀看此視頻,並採取輸出面板上的外觀以及。
http://screencast.com/t/DFkmlDKR
在視頻中,我試圖尋找「一」(只是一個測試),並返回所有以「A」,然後我按向下和向上箭頭鍵啓動谷歌搜索結果中。在輸出面板中,當我按下這些鍵時,它會顯示突出顯示的項目。
然後我輸入下一個字母「l」。現在,如果您注意到輸出面板上的選擇現在爲「空」,但我仍然按下向下箭頭鍵。
而當您使用鼠標指針再次懸停在該項目上時,它將再次開始工作。
我被這個問題困住了幾天,還沒有想出解決方案。
我已經上傳了這個控件的測試版本,所以你也可以使用它。這是GoogleSuggestionComboBox
我的目標在這裏是使UP &向下箭頭鍵工作的所有時間。
在代碼 的這一部分,我試圖foreach語句所以每次採集重新填充有新的結果後加入
SelectedIndex = 0;
,它會選擇第一個結果。不幸的是,它沒有奏效。
您可以下載測試代碼,以便播放和測試問題。 http://sdrv.ms/1eWV3Bc,這裏也是ComboBox的代碼。
using GoogleSuggestionComboBox.Model;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace GoogleSuggestionComboBox
{
public class ComboBoxExC : ComboBox
{
GoogleSuggest google;
TextBox textbox;
string _text = string.Empty;
string _last_text = string.Empty;
public ComboBoxExC()
{
if (DesignerProperties.GetIsInDesignMode(this))
{
}
else
{
this.Loaded += ComboBoxExC_Loaded;
google = new GoogleSuggest();
google.OnGoogleSuggestAvailable += google_OnGoogleSuggestAvailable;
// since we have OnSelectionChanged "disabled"
// we need a way to know if the item in ComboBox is selected using mouse
EventManager.RegisterClassHandler(typeof(ComboBoxItem), ComboBoxItem.MouseDownEvent, new MouseButtonEventHandler(OnItemMouseDown));
}
}
void ComboBoxExC_Loaded(object sender, RoutedEventArgs e)
{
this.textbox = (TextBox)Template.FindName("PART_EditableTextBox", this);
}
private void OnItemMouseDown(object sender, MouseButtonEventArgs e)
{
var comboBoxItem = sender as ComboBoxItem;
if (comboBoxItem != null && comboBoxItem.IsHighlighted)
{
Model_SuggestedQueries m = (Model_SuggestedQueries)comboBoxItem.Content;
Go(m.Query);
}
}
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
// don't do anything so the .Text value won't change.
//base.OnSelectionChanged(e);
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
this.IsDropDownOpen = true;
base.OnPreviewKeyDown(e);
d("key: " + e.Key.ToString());
if (this.SelectedItem != null)
{
Model_SuggestedQueries m = (Model_SuggestedQueries)this.SelectedItem;
d("selected: " + m.Query);
}
else
{
d("null");
}
}
protected override void OnPreviewKeyUp(KeyEventArgs e)
{
base.OnPreviewKeyUp(e);
if (e.Key == Key.Enter)
{
if (this.SelectedItem == null)
{
Go(this.Text);
}
else
{
Model_SuggestedQueries m = (Model_SuggestedQueries)this.SelectedItem;
Go(m.Query);
}
}
else
{
if (this.Text != this._last_text)
{
google.LookForSuggestion(this.Text);
this._last_text = this.Text;
}
}
}
void google_OnGoogleSuggestAvailable(object sender, List<Model.Model_SuggestedQueries> suggestions)
{
this.Items.Clear();
suggestions.ForEach((a) =>
{
this.Items.Add(a);
});
}
void d(object a)
{
Debug.WriteLine(">>> " + a);
}
void Go(string query)
{
Process.Start("https://www.google.com.ph/search?q=" + query);
// clear suggestions
this.Items.Clear();
}
}
}
MainWindow.xaml
<Window x:Class="GoogleSuggestionComboBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:GoogleSuggestionComboBox"
Title="MainWindow" Height="133" Width="261" WindowStartupLocation="CenterScreen"
>
<Grid>
<StackPanel Margin="10">
<TextBlock Text="Search" />
<l:ComboBoxExC
IsEditable="True"
IsTextSearchEnabled="False"
TextSearch.TextPath="Query"
>
<l:ComboBoxExC.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Query}" />
</DataTemplate>
</l:ComboBoxExC.ItemTemplate>
</l:ComboBoxExC>
</StackPanel>
</Grid>
</Window>
謝謝
傑森
感謝@Soner格尼爾 –
不要讓用戶與您的代碼玩。請分享代碼中確實存在問題的部分,並制定直接問題。 – meilke
對我來說,你試圖重新發明輪子。使用常規的組合框。 (或從WPF工具包或其他東西的自動完成框) –